我偶然发现了这个帖子在 Objective-C 中,为什么我应该检查 self = [super init] 是否不为零?
我能够了解这个语法:
- (id)initWithString:(NSString *)aString
{
self = [super init];
if (self)
{
instanceString = [aString retain];
}
return self;
}
or 这个语法:
- (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)相比或多或少做了什么?我读到的所有内容都很令人困惑(为什么人们不能同意纯粹技术性的东西,这似乎是政治:))
然而,当我阅读作者的文章时,我可以模糊地理解它远远超出了句法糖辩论或品味问题。例如据说:
奇怪的是,虽然情况 3 绝大多数更为常见,但支持 1、2 和 4 但与情况 3 不兼容的初始化程序已成为标准。那么奇怪的是,虽然情况 3 绝大多数更为常见,但支持 1、2 和 4 但与情况 3 不兼容的初始化程序与情况 3 不兼容已成为标准。
因此,如果可能的话,我希望从 Objective C 大师那里得到深刻的哲学答案。
理解(3)的关键是if行
if((self = [super init])) {
在C中,每个运算符都有一个返回值,只是你不必使用它。所以就像3 + 4
返回 7,运算符=
返回与刚刚分配的值相同的值。这允许你用它做一些有趣的事情:
int a, b, c, d;
a = b = c = d = 5;
(这是有效的,因为运算符具有从右到左的关联性。这意味着a = b = 3;
相当于a = (b = 3);
so b
首先设置为三,然后a
被设置为相同的值。)
所以现在我们可以观察到测试
if((self = [super init])) {
完全一样
self = [super init];
if (self) {
不过,他们都做完全相同的事情。至于首选方案,很多人认为将表达式放入 if 语句中是不好的做法,因为如果不习惯的话很难注意到。苹果似乎确实已经解决了您在模板中列出的第一个示例,并且还为第一个示例添加了编译器警告,如果您尝试在不使用愚蠢的双括号的情况下执行此操作if(())
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)