2011-04-28 2 views
3
NSString *msgg = [NSString alloc]; 
NSLog(@" address that msgg is holding is %p ", msgg); 
msgg = [msgg init]; 
NSLog(@" address that msgg is holding is %p ", msgg); 

이제 alloc은 객관적인 c가 memomr로 가서 공간을 조각한다는 것을 의미합니다. 이 공간의 주소는 포인터 msgg에 보관됩니다.여기에 멍청한 놈 - 객관적인 C 포인터가 다른 주소?

인스턴스도 동일한 공간에 만들어집니다. 그래서 저는 그 주소가 그대로 유지 될 것으로 기대하고 있습니다. 그러나 주소를주의 follows.Please로 콘솔에 내 출력이는 +alloc에 의해 반환되는 인스턴스가 후속 initialiser (예를 들어, -init)에 의해 반환 된 같은 인스턴스임을 보장은 없습니다

BasicObjC[3064:10b] address that msgg is holding is 0x103340 
BasicObjC[3064:10b] address that msgg is holding is 0xa0289328 

답변

2

"정상적인"수업에서는 이것이 사실이어야합니다 (그러나 그것에 의존해서는 안됩니다). 그러나 NSString (실제로 많은 애플의 데이터 클래스 인 NSData, UIImage)의 경우이 클래스는 실제로 "클래스 클러스터"입니다. "NSString"이라는 개체를 사용하지만 돌아 오는 클래스는 다른 다른 클래스 (NSCFString 일 가능성이 높음)입니다. NSString에는 다른 비밀 클래스가 있습니다. NSString을 할당하면 "더미 (dummy)"객체가 만들어지고, 특정 값으로 init을 호출하면 실제로 알려줄 비밀 클래스 (즉, 다른 주소)가 결정됩니다.

좀 더 이해하기 쉬운 예제는 UIImage입니다. UIImage는 다양한 이미지 유형 (png, jpg 등)으로 만들 수 있습니다. 당신에게 UIImage처럼 보이지만 init을 호출하면 실제로 참조하는 각 이미지 유형마다 다른 하위 클래스가 반환됩니다.

+0

위대한 설명. 엄청 고마워! – user726102

+1

@ user726102이 동작은 클래스 클러스터에서 실제로 사용되지만 거의 독점적이지 않습니다. –

2

다릅니다.

예를 들어, NSString의 초기화 프로그램 중 하나가 사전 할당 된 리터럴 문자열을 반환 할 수 있습니다. 이 경우 +alloc을 통해 생성 된 인스턴스는 할당이 해제되고 initialiser는 대신 리터럴 문자열의 주소를 반환합니다.

1

우리가 항상 -alloc 및 -init 메시지를 중첩하는 이유는 -init가 self를 반환 할 필요가 없기 때문입니다. 새로 생성 된 객체는 자유롭게 반환 할 수 있습니다.

관련 문제