想知道下面代码中if (self = [super ...的意义是什么吗?它试图防范的是什么情况?
- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier]) {
// STUFF CONFIGURED HERE
}
return self;
}带上了from here。
发布于 2011-03-11 12:31:28
它可以防止超级实现返回nil。如果超类决定它不能初始化对象,它可以释放它并返回nil,如果您试图进行任何初始化,这将使程序崩溃,因为您正在尝试取消引用nil指针。
发布于 2011-03-11 12:33:11
如果超类中的函数失败并返回nil,那么"//STUFF CONFIGURED HERE“代码将不会执行,函数将只返回nil。
这可能是你想要的行为,因为你的“//在这里配置的东西”代码可能依赖于超类函数来工作而不会出现错误。
发布于 2011-03-11 15:17:25
super的初始化器不仅可以自由返回nil,还可以返回指向self以外的对象的指针。这看起来很奇怪,但你不需要找很远的地方就能找到例子。考虑一下:
NSString *string1 = @"foo";
NSString *string2 = [[NSString alloc] initWithString:string1];
NSLog(@"\nstring1 is located at:%p \nstring2 is located at:%p", string1, string2);显然,string1和string2是两个不同的对象,对吧?一个是常量字符串,另一个分配在堆中的某个地方。所以看到这段代码的结果有点让人惊讶:
string1 is located at:0x3044
string2 is located at:0x3044为什么这两个指针是相同的?好吧,NSStrings是不可变的。因为它们不能改变,所以没有理由让两个值完全相同。NSString的-initWithString:方法看起来像:
-(NSString*)initWithString:(NSString*)string
{
if ([string isMemberOfClass:[NSString class]] == YES) {
[self release];
self = [string retain];
}
else {
// set up new immutable copy of string here
}
return self;
}注意不寻常的“自我释放”。init方法将返回一个不同于已分配对象的对象,这是将-release发送给自身的少数几种情况之一。
在其他情况下,初始化器可能决定返回不同的对象或nil,这就是为什么总是将super的初始化器的结果赋给self是很重要的。在访问它的实例变量之前,检查返回的指针是否是非nil也很重要,这就是为什么赋值发生在'if‘条件中。
https://stackoverflow.com/questions/5268954
复制相似问题