2010-06-30 54 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中同樣的問題,如果你有一個副作用,它有可能炸燬。