我偶然发现了这个帖子In Objective-C why should I check if self = [super init] is not nil?自我= [超级初始化]再访
我能理解this syntax:
- (id)initWithString:(NSString *)aString
{
self = [super init];
if (self)
{
instanceString = [aString retain];
}
return self;
}
- (id)init;
{
if (!(self = [super init]))
return nil;
// other stuff
return self;
}
,但我还是不明白“标准”模板语法
- init {
if((self = [super init])) {
// set up instance variables and whatever else here
}
return self;
}
有人可以尽可能清楚地告诉(3)与(1)或(2)相比,或多或少有什么作用?我读过的所有内容都很混乱(为什么人们不能同意纯粹技术的东西看起来像政治:))
不过,当我阅读作者的文章,并且我可以模糊地理解它,远远超出了仅仅是语法糖辩论或品味的问题。例如it is said:
奇怪然后,当壳体3是压倒性多见,支持1,2和4,但不兼容与壳体3已经成为standard.Curiously然后初始化,而壳体3是压倒性更常见,支持1,2和4但与情况3不兼容的初始化器已成为标准。
因此,如果可能的话,我想从Objective C Gurus得到一个深刻的哲学答案。
至于你关于Cocoa with Love的问题,我相信他在谈论罕见的情况,其中'[super init]'返回超类的单例实例,在这种情况下,他不想重写实例变量目的。就我而言,这更像是一种学术上的好奇心,而不是你需要担心的任何事情。 – joerick 2012-03-04 11:49:27
谢谢我现在更好地理解3的语法,所以我给你正确的答案,因为这是我首先提出的问题。尽管如此,他认为[超级初始化]可以返回4个案例,而语法3只能处理3个案例,而不处理可能相当频繁的第四个案例。所以这不是品味的问题:这是一个考虑到所有例外的问题,否则你的应用程序不健壮,你不同意吗? – user310291 2012-03-04 13:21:03
在Cocoa中这是一个非常罕见的情况,你想要继承这些会导致问题的对象之一。这些示例是类集群或单例对象。至少,我可以想到没有理由继承一个单身人士,而不用另外引用单身人士。至于继承类集群,通常在Cocoa中,我们更喜欢[对象组合](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html# // apple_ref/doc/uid/20000154-397934),而不是继承。 – joerick 2012-03-04 13:35:06