新增目標-c。編寫了一段代碼片段以更好地理解init機制,並最終提出了一些問題。Objective-c - [super init]返回什麼?
@implementation MyClass
-(id) init
{
if (self) {
i = 5;
NSLog(@"self before init - %@ %p i=%d",[self className], &self, i);
} else {
NSLog(@"self is null???");
}
id someClass = [super init];
NSLog(@"the result of super-init - %@ %p",[someClass className], &someClass);
self = [super init];
if (self) {
NSLog(@"self after init - %@ %p %d",[self className], &self, i);
} else {
NSLog(@"self is null???");
}
return self;
}
i
是私有實例變量int
。
下面是結果:
2012-12-14 18:01:26.403 Init[1621:303] self before init - MyClass 0x7fff5fbff848 i=5
2012-12-14 18:01:26.405 Init[1621:303] the result of super-init - MyClass 0x7fff5fbff838
2012-12-14 18:01:26.405 Init[1621:303] self after init - MyClass 0x7fff5fbff848 5
真正讓我吃驚的是,那SomeClass的類名是MyClass
。
NSObject
如何知道返回子類實例(不只是類型匹配,它是完全相同的對象)?
我知道,這是不好的形式調用init
很多次,並呼籲init
前初始化實例變量,但我只是嘗試。
謝謝。
您不應該使用'&someClass' - 它返回引用的地址,而不是引用包含的內容。使用'someClass'。 – nielsbot
'''-init'在'+ [ alloc]'的結果上被調用,當然這返回一個(未初始化的)實例......'-init'不會進行分配。 –
nielsbot
@nielsbot說的是真的 - 你打印的地址是指針變量的地址,而不是變量指向的對象的地址。這可能會造成一些混淆。 –