首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"if (self = [super :frame reuseIdentifier:reuseIdentifier])“的意义是什么?

"if (self = [super :frame reuseIdentifier:reuseIdentifier])“的意义是什么?
EN

Stack Overflow用户
提问于 2011-03-11 12:29:33
回答 3查看 1.2K关注 0票数 2

想知道下面代码中if (self = [super ...的意义是什么吗?它试图防范的是什么情况?

代码语言:javascript
复制
- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier]) {
        // STUFF CONFIGURED HERE
    }
    return self;
}

带上了from here

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-11 12:31:28

它可以防止超级实现返回nil。如果超类决定它不能初始化对象,它可以释放它并返回nil,如果您试图进行任何初始化,这将使程序崩溃,因为您正在尝试取消引用nil指针。

票数 5
EN

Stack Overflow用户

发布于 2011-03-11 12:33:11

如果超类中的函数失败并返回nil,那么"//STUFF CONFIGURED HERE“代码将不会执行,函数将只返回nil。

这可能是你想要的行为,因为你的“//在这里配置的东西”代码可能依赖于超类函数来工作而不会出现错误。

票数 1
EN

Stack Overflow用户

发布于 2011-03-11 15:17:25

super的初始化器不仅可以自由返回nil,还可以返回指向self以外的对象的指针。这看起来很奇怪,但你不需要找很远的地方就能找到例子。考虑一下:

代码语言:javascript
复制
NSString *string1 = @"foo";
NSString *string2 = [[NSString alloc] initWithString:string1];
NSLog(@"\nstring1 is located at:%p \nstring2 is located at:%p", string1, string2);

显然,string1和string2是两个不同的对象,对吧?一个是常量字符串,另一个分配在堆中的某个地方。所以看到这段代码的结果有点让人惊讶:

代码语言:javascript
复制
string1 is located at:0x3044 
string2 is located at:0x3044

为什么这两个指针是相同的?好吧,NSStrings是不可变的。因为它们不能改变,所以没有理由让两个值完全相同。NSString的-initWithString:方法看起来像:

代码语言:javascript
复制
-(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‘条件中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5268954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档