我有一个关于在Objective-C中编写init方法的一般问题.
我看到它到处都是(Apple的代码,书籍,开源代码等)init方法应该在继续初始化之前检查self = [super init]是否为nil.
init方法的默认Apple模板是:
- (id) init
{
self = [super init];
if (self != nil)
{
// your code here
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
为什么?
我的意思是什么时候初始会返回零?如果我在NSObject上调用init并且没有回来,那么一定要搞砸了,对吗?在那种情况下,你甚至可以不写一个程序......
类'init方法可能返回nil真的很常见吗?如果是这样,在什么情况下,为什么?
我偶然发现这篇文章在Objective-C中我为什么要检查self = [super init]是不是nil?
我能理解这种语法:
- (id)initWithString:(NSString *)aString
{
self = [super init];
if (self)
{
instanceString = [aString retain];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
或者这个语法:
- (id)init;
{
if (!(self = [super init]))
return nil;
// other stuff
return self;
}
Run Code Online (Sandbox Code Playgroud)
但我仍然不理解"标准"模板语法
- init {
if((self = [super init])) {
// set up instance variables and whatever else here
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
有人可以尽可能清楚地告诉(3)与(1)或(2)相比更多或更少吗?我读到的都是如此令人困惑(为什么人们不能同意纯粹技术性的东西似乎是政治:))
然而,当我读到作者的文章时,我可以模糊地理解它远不仅仅是语法糖辩论或品味问题.例如,据说:
奇怪的是,虽然案例3非常普遍,但支持1,2和4但与案例3不兼容的初始化程序已经成为标准.然而,案例3绝大多数情况下,初始化程序支持1,2和4但是与案例3不相容已成为标准.
所以,如果可能的话,我想从Objective C Gurus那里得到一个深刻的哲学答案.