-1

可能重复:
在 Objective-C 中,我为什么要检查 self = [super init] 是否不为零?

我是 Ob-C 的新手,我很难理解为什么返回的值不是 nil,正如“if 语句”所测试的那样。

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }

    return self;
}

此方法首先调用父初始值设定项。执行父级的初始化程序可确保正确初始化任何继承的实例变量。您必须将执行父级的 init 方法的结果分配回自身,因为初始化程序有权更改对象在内存中的位置(意味着其引用将更改)。如果 parent 的初始化成功,则返回的值将是 non-nil,如 if 语句所测试的那样。正如注释所示,在后面的块内,您可以为您的对象放置您自己的自定义初始化代码。这通常涉及分配和初始化类中的实例变量。

粘贴来自 Stephen Kochan“Objective-C 编程,第四版”的代码和文本

4

1 回答 1

2

考虑以下场景,您有一个父类,我们将其称为Parent,它具有以下布局:

@implementation Parent {
    int value;
}

并且您有一个 class Child,它是 的子类Parent,并且具有以下布局:

@implementation Child {
    int other;
}

Child子类中,您无法直接访问Parent名为value. 但是,在其初始化中,Parent将一些整数分配给value,并且其中的某些功能Parent取决于设置的此值。

如果Child不调用[super init]value将永远不会被初始化Parent,并且Child继承的部分功能将被破坏。该init方法被定义为返回一个指向已初始化对象实例的指针。如果忽略 的返回值[super init],可能会遇到麻烦,因为父级 init 可能已决定将对象实例重新分配到分配器提供的位置以外的某个位置。

例如,NSString 可以检测空字符串字面量的初始化,并将返回一个指向常量 NSString 引用的指针,而不是堆上的指针。所以说你只是调用[super init]并忽略它的返回值,并继续使用self传递给Childsinit方法的指针值,你突然使用了一个悬空指针!

这是一个极端的情况,但重点是,如果您打算从父类继承功能,您应该将 self 分配给[super init],并且您应该检查它是否返回nil,因为它可能决定初始化失败并破坏提供给它的内存由分配器。

于 2012-11-01T04:47:28.893 回答