Wil Shipley 推荐 this(自 2009 年起):
- (id)init;
{
if (!(self = [super init]))
return nil;
// other stuff
return self;
}
但是为什么要把 super init 的 return 分配给 self 呢?
Matt Gallagher 的 article 试图解释它...
-- 引用:
如果你还记得一开始,我
表示 initWithString: 的一部分
一个典型的 [[MyClass alloc]
initWithString:@"someString"]
调用被转换为
objc_msg发送调用:
MyClass *myObject2 = objc_msgSend(myObject1, initSelector, @"someString");
所以当我们得到
到方法的内部,self
已经有值了;它的价值是
myObject1(即分配的对象,
从 [MyClass alloc] 返回
称呼。这是必不可少的,因为
没有它,超级调用
不可能——自我价值
编译器使用它来发送
调用:
[super init];
变成:
objc_msgSendSuper(self, @selector(init));
是的,自己已经
当你的初始化器有一个值
开始。其实差不多
保证是正确的,最终的
价值。
-- 取消引用
基本上,我认为很多人对每个 init 方法的“自我”到底指向什么感到困惑,通过超类链向上。
Apple 的 Objective-C Programming Language doc 中标题为“指定初始化程序”的部分下暗示了这个谜题的答案:
注意 B 版本的 init 发送一个
给自己的消息以调用
initWithName:方法。因此,当
接收者是 B 的一个实例
类,它调用 B 版本的
initWithName:,以及当接收者
是 C 类的一个实例,它
调用 C 版本。
或者,换句话说,“self”变量指向我们正在初始化的实例。再次强调,所有这些通过超类链向上的 init 方法都由我们的实例继承,因此,它们中的“self”变量指向我们的实例(除非显式更改)。
我说的对吗?当然!