Objective-C를 배우려고 노력 중이며 다음과 같은 문구가 계속 나타납니다.
-(id) init;
그리고 저는 idObjective C 언어 키워드라는 것을 이해 합니다. 그러나 "컴파일러 id가 포인터 유형 변환 규칙과 관련하여 구체적으로 취급한다"는 의미는 무엇 입니까?
id자동으로 오른쪽에있는 개체를 포인터로 지정 합니까 ?
답변:
id모든 유형에 대한 포인터이지만 void *항상 Objective-C 개체를 가리키는 것과는 다릅니다 . 예를 들어 idNSArray 에 유형의 모든 것을 추가 할 수 있지만 이러한 객체는 retain및에 응답해야합니다 release.
컴파일러는 암시 적으로 개체를 캐스팅하기 위해 완전히 행복 id, 당신을 위해 캐스팅에 id어떤 객체. 이것은 Objective-C의 다른 암시 적 캐스팅과는 달리 Cocoa에서 대부분의 컨테이너 유형의 기초입니다.
id 의 정의는 typedef struct objc_object *id;이므로 Objc객체를 가리키는 포인터 입니다.
NSObject합니까? 수단, 내가 바꿀 수 id와 NSObject는 반환 유형 때?
idObjective-C 개체 ( objc_object)에 대한 포인터 입니다. 이것은 단지 void 포인터가 아니므로 그렇게 취급해서는 안됩니다. 유효한 isa포인터 가 있어야하는 개체를 참조합니다 . 저장 될 수있는 값은에서 상속하지도 않는 클래스 뿐만 아니라 프로토콜 의 존재를 이해하기 시작 id하는 NSObject및 그 자손에 국한 되지 않습니다 . 컴파일러를 사용하면 유형별 로 참조되는 객체 를 모든 객체 유형에 할당하고, 모든 객체 유형을에 할당하고 , 경고없이 모든 메시지 (컴파일러가 본)를 보낼 수 있습니다.NSObjectNSProxyNSObjectidid
id일반 유형입니다. 이는 컴파일러가 거기에 어떤 객체 유형도 예상 하고 제한을 적용하지 않음을 의미합니다 . 둘 이상의 객체 클래스를 사용할 것으로 예상되는 경우 유용 할 수 있습니다. 그런 다음 introspection을 사용하여 어떤 클래스인지 확인할 수 있습니다. idObjective-C의 모든 개체가 포인터 / 참조로 전달되므로 자동으로 포인터를 가정합니다.
일부 추가 리소스 :
id vs NSObject vs id *
Objective-C 프로그래밍 (위키 북)
Introspection
Dynamic Typing
예, 아니오. id xx를 포인터로 지정 하는 것은 사실 이지만 "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을 사용하는 것이 유익할까요?
void*