새 객체를 만들고 초기화하면 왜 id를 사용합니까? (NSObject *)를 사용할 수 없습니까?id 대신 초기화 중에 NSObject를 사용하지 마십시오
답변
목표 C의 모든 개체가 NSObject
인 것은 아닙니다. NSObject
에서 파생되지 않은 다른 루트 클래스 (예 : NSProxy
)가 있습니다.
id
은 절대적으로 모든 개체를 의미합니다. 모든 메시지 (Class
포함)를받을 수있는 목표 C는 유형 경고없이 id
으로 전달할 수 있습니다.
NSObject*
은 실제로 NSObject
에서 파생 된 개체에만 유용합니다. 파생되지 않은 것을 전달하면 검사기가 불평 할 것입니다.
거의; 'id'가 사용되는 큰 이유 중 하나는'NSObject * '가 더 구체적인 타입으로 변환 할 필요가 없기 때문입니다. – bbum
NSObject
은 고유 한 목표 C 클래스입니다. 대부분 에 대한 기본 클래스입니다. (* 전부는 아니지만, HamsterGene에게는 +1입니다.)하지만 여전히 클래스입니다.
그리고 그것에 (이 NSObject
에서을 내려하는 것이 모든 유형의) 새로운 객체를 할당하는 경우, 당신은 상속을했다 당신이 만들어 낸 서브 클래스 어떤 종류의 & 속성을 잃을 것입니다.
id
은 당신이 void *
에 (이 내용이나 형식의에 대한주의)는 메모리의 랜덤 덩어리를 할당하는 방법을 같이 id
에 대한 객관적인 C 객체를 할당 할 수있는 행동의에 void *
에 roughly equivalent입니다.
예, 가능합니다. 다음은이 모든 것을 설명하는 [article] (http://unixjunkie.blogspot.com/2008/03/id-vs-nsobject-vs-id.html)입니다. – demon9733