簡體   English   中英

為什么我應該直接從初始化方法中訪問實例變量?

[英]Why I should access the instance variable directly from within an initialization method?

使用Objective-C文檔的Apple Programming聲明:

您應該始終直接從初始化方法中訪問實例變量,因為在設置屬性時,對象的其余部分可能尚未完全初始化。 即使您不提供自定義訪問器方法或從您自己的類中知道任何副作用,未來的子類也可以很好地覆蓋該行為。

但是我不知道setter方法會有什么副作用,請舉個例子來解釋為什么我必須直接從初始化方法中訪問實例變量

答案很簡單 - 它是代碼味道。 self.foobar = something點符號self.foobar = something Objective-C中的self.foobar = something只是用於消息傳遞的語法糖。 self發送消息通常很好。 但是有兩種情況需要避免它們:

1.創建對象時,和

2.當物體被摧毀時。

在這兩次,對象處於一種奇怪的中間狀態。 它缺乏誠信。 在這些時間調用方法是代碼味道,因為每個方法都應該在對象上操作時保持不變量。

如果子類重寫了setter方法,則無法保證實例變量將包含正確的數據。 如果要在初始化等關鍵階段維護對象內的數據完整性,則應按Apple建議進行操作。

除了@JacobRelkin點之外,副作用還包括鍵值觀察。 即使在-init*-dealloc期間,其他對象也可以觀察到更改。 我以前有一個KVO -dealloc錯誤。

確實是直接設置和拆除ivars的最佳實踐。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM