为什么我不在init方法中使用访问器方法

Pie*_*ade 7 memory-management objective-c

从Apple有关内存管理的文档:

您不应该使用访问器方法来设置实例变量的唯一地方是init方法和dealloc.要使用表示零的数字对象初始化计数器对象,可以按如下方式实现init方法:

要允许使用非零计数初始化计数器,您可以实现initWithCount:方法,如下所示:

- initWithCount:(NSNumber *)startingCount {
    self = [super init];
    if (self) {
        count = [startingCount copy];
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

为什么不 ?

Jer*_*myP 16

看看我对这个问题的回答.

主要原因是因为子类可能会覆盖您的访问器并执行不同的操作.子类的访问器可能假设一个完全初始化的对象,即子类的init方法中的所有代码都已运行.事实上,当你的init方法运行时,它都没有.类似地,子类的访问器可能依赖于子类的dealloc方法没有运行.当你的dealloc方法运行时,这显然是错误的.

要扩展您的示例,如果您已经完成了

- initWithCount:(NSNumber *)startingCount {
    self = [super init];
    if (self) {
        [self setCount: [startingCount copy]];
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

但是一个子类已经重写了setCount:除了设置你的count变量之外还做一些事情,你可能遇到麻烦了.