Objective-C를 배우려고 노력 중이며 다음과 같은 문구가 계속 나타납니다.
-(id) init;
그리고 저는 id
Objective C 언어 키워드라는 것을 이해 합니다. 그러나 “컴파일러 id
가 포인터 유형 변환 규칙과 관련하여 구체적으로 취급한다”는 의미는 무엇 입니까?
id
자동으로 오른쪽에있는 개체를 포인터로 지정 합니까 ?
답변
id
모든 유형에 대한 포인터이지만 void *
항상 Objective-C 개체를 가리키는 것과는 다릅니다 . 예를 들어 id
NSArray 에 유형의 모든 것을 추가 할 수 있지만 이러한 객체는 retain
및에 응답해야합니다 release
.
컴파일러는 암시 적으로 개체를 캐스팅하기 위해 완전히 행복 id
, 당신을 위해 캐스팅에 id
어떤 객체. 이것은 Objective-C의 다른 암시 적 캐스팅과는 달리 Cocoa에서 대부분의 컨테이너 유형의 기초입니다.
답변
id
Objective-C 개체 ( objc_object
)에 대한 포인터 입니다. 이것은 단지 void 포인터가 아니므로 그렇게 취급해서는 안됩니다. 유효한 isa
포인터 가 있어야하는 개체를 참조합니다 . 저장 될 수있는 값은에서 상속하지도 않는 클래스 뿐만 아니라 프로토콜 의 존재를 이해하기 시작 id
하는 NSObject
및 그 자손에 국한 되지 않습니다 . 컴파일러를 사용하면 유형별 로 참조되는 객체 를 모든 객체 유형에 할당하고, 모든 객체 유형을에 할당하고 , 경고없이 모든 메시지 (컴파일러가 본)를 보낼 수 있습니다.NSObject
NSProxy
NSObject
id
id
답변
id
일반 유형입니다. 이는 컴파일러가 거기에 어떤 객체 유형도 예상 하고 제한을 적용하지 않음을 의미합니다 . 둘 이상의 객체 클래스를 사용할 것으로 예상되는 경우 유용 할 수 있습니다. 그런 다음 introspection을 사용하여 어떤 클래스인지 확인할 수 있습니다. id
Objective-C의 모든 개체가 포인터 / 참조로 전달되므로 자동으로 포인터를 가정합니다.
일부 추가 리소스 :
id vs NSObject vs id *
Objective-C 프로그래밍 (위키 북)
Introspection
Dynamic Typing
답변
- id 는 Objective-C의 객체 식별자 데이터 유형으로, 어떤 클래스가 있든 관계없이 모든 유형의 객체에 사용할 수 있습니다.
id 는 모든 객체의 최종 수퍼 유형입니다.
Java 또는 C #에서는 다음과 같이 사용합니다.
Object data = someValue;
String name =(Object)data;
그러나 객관적인 c
id data= someValue;
NSString *name= data;
답변
예, 아니오. id x
x를 포인터로 지정 하는 것은 사실 이지만 “id”에는 특수한 유형 변환 규칙이 있기 때문에 포인터 유형 변환 규칙이 적용된다는 것은 잘못된 것입니다. 예를 들어 void *
포인터로는 다음을 수행 할 수 없습니다.
void *x;
char *y = x; // error, this needs an explicit cast
반대로 id로 가능합니다.
id x;
NSString *y = x;
객관적인 c 예제에서 유형 id 의 더 많은 사용법을 참조하십시오 .
또한 “현대적인”Objective C에서는 instancetype
“init”메서드에서 “id”대신 사용 하는 것이 좋습니다 . 이를 변경하기위한 Xcode에는 자동 변환 도구도 있습니다. instancetype에 대해 읽어보십시오 : id 대신 instancetype을 사용하는 것이 유익할까요?