Objective-C点语法和初始化

9

我读过许多关于在init或dealloc方法中永远不要使用点符号表示法的片段。然而,我似乎从未找到为什么这样做的原因。有一篇帖子提到这与KVO有关,但没有更多的解释。

@interface MyClass : NSObject {
    SomeObject *object_;
}
@property (nonatomic, retain) SomeObject *object;
@end

这个实现很糟糕吗?
@implementation MyClass 

@synthesize object = object_;

- (id)initWithObject:(SomeObject *)object {
    if (self = [super init]) {
        self.object = object;
    }

    return self;
}
@end

但这是好的吗?
@implementation MyClass 

@synthesize object = object_;

- (id)initWithObject:(SomeObject *)object {
    if (self = [super init]) {
        object_ = [object retain];
    }

    return self;
}
@end

在init中使用点符号的缺陷是什么?

在第二个例子中,似乎你应该写成 object_ = [object retain]; - Vladimir
固定的,快速编写示例的问题。 ;) - MarkPowell
2个回答

26

首先,问题不在于点表示法本身,而在于您不应使用的访问器。

self.foo = bar;

完全相同

[self setFoo: bar];

这两种方法都不被init/dealloc所赞同的主要原因是子类可能会覆盖您的访问器并执行不同的操作。子类的访问器可能假定一个完全初始化的对象,即当您的init方法正在运行时,子类的所有代码已经运行。同样,子类的访问器可能依赖于子类的dealloc方法没有运行。但是在您的dealloc方法运行时,这显然是错误的。


刚才给这个答案点了踩的人能否解释一下为什么? - JeremyP

1
我听到的主要原因是当你编写自己的setter/getter时会出现问题。当使用默认的@synthesized方法时,不会引起太多问题。但是当你编写自己的setter时,通常会对你的类产生副作用。这种副作用可能不希望在init中出现,甚至会在引用尚未创建的其他ivars时引起问题。如果有副作用,则dealloc也存在同样的问题,可能会导致程序崩溃。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接