2010-06-30 76 views
9

我已经阅读了大量摘录,提到你不应该在你的init或dealloc方法中使用点符号。但是,我似乎无法找出原因。有一篇文章顺带提到它与KVO有关,但没有更多。Objective-C点语法和初始化

@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中使用点符号的缺陷是什么?

+0

看来在第二个例子中你应该写object_ = [object retain]; – Vladimir 2010-06-30 15:13:24

+0

固定,用快速书写的例子麻烦。 ;) – MarkPowell 2010-06-30 15:17:54

回答

25

首先,它不是特别的点符号,它是您不应该使用的访问器。

self.foo = bar; 

相同

[self setFoo: bar]; 

和它们都在初始化/ dealloc的内皱眉。

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

+0

谁刚刚投下了这个答案,请解释他们为什么这样做? – JeremyP 2010-10-06 16:15:08

1

我听说的原因主要是因为你编写自己的setter/getters而出现的。当使用方法的默认@synthesized版本时,它不会引起太多问题。当你编写自己的setter时,它通常会对你的课程产生副作用。这种副作用可能不是在init中需要的,或者如果它引用其他尚未创建的ivars,则会引发问题。在dealloc中同样的问题,如果你有一个副作用,它有可能炸毁。