Ios 什么';“这是什么意思?”;if(self=[super initWithFrame:frame reuseIdentifier:reuseIdentifier])”;

Ios 什么';“这是什么意思?”;if(self=[super initWithFrame:frame reuseIdentifier:reuseIdentifier])”;,ios,objective-c,Ios,Objective C,想知道下面代码中if(self=[super…的意义是什么?它试图防止什么情况 - (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier { if (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier]) { // STUFF CONFIGURED HERE } return se

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

- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier]) {
        // STUFF CONFIGURED HERE
    }
    return self;
}

已获取。

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

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


这可能是您想要的行为,因为您的“//STUFF CONFIGURED HERE”代码可能依赖于super classes函数来工作而不会出错。

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
为什么两个指针都相同?嗯,NSString是不可变的。因为它们不能更改,所以从来没有理由让两个指针具有完全相同的值。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;
}
请注意不寻常的“[self release]”。将返回一个对象而不是被分配的对象的init方法是将-release发送给self有意义的少数情况之一


在其他情况下,初始值设定项可能决定返回另一个对象或nil,这就是为什么始终将super的初始值设定项的结果分配给self很重要。在访问其实例变量之前检查返回的指针是否为非nil也很重要,这就是为什么分配发生在“if”中的原因条件。

@ughoavgfhw呃,我不认为程序会崩溃-你可以向
nil
@Jacob发送消息,是的,但是如果你试图更改初始值设定项中的任何实例变量,它会崩溃。如果超级实现返回nil,这本身不是一个大问题吗?应用程序是否有效地不能工作正确并保证一些错误通知?返回nil是初始值设定项告诉调用代码有错误的正确方法。然后该代码负责处理错误。这就像malloc在无法分配内存时返回NULL一样。@Greg初始值设定项返回nil表示fai是完全可以接受的在mac上,(和其他)记录为可以返回零。