Property和例項變數(Ivar)的最佳實踐

2021-07-11 12:41:18 字數 1235 閱讀 8799

property應該代表乙個物件的狀態,getter應該沒有外部影響(它們可以具有內部影響,例如caching,但那些應該是呼叫者不可見的)。

避免直接訪問例項變數,使用accessor來代替。

在早期的arc裡,引起bug最常見的原因就是直接訪問例項變數。開發者沒有正確的retain和release例項變數,它們的應用就會崩潰或者記憶體洩露。由於arc自動管理retain和release,一些開發者認為這個規則已經不再重要,但仍還有其他使用accessors的原因:

* kvo

也許使用accessor的最關鍵原因是,property可以被觀察到。如果你不使用accessor,你需要在每次修改property裡的例項變數時呼叫willchangevalueforkey: 和 didchangevalueforkey: ,而accessor會在需要時自動呼叫這些方法。

* side effects

在setter裡,你或者你的子類可能包含side effects。通知可能被傳送、事件可能被註冊到nsundomanager裡,你不應該繞過這些side effects,除非它是必要的。

* lazy instantiation

如果乙個property被lazily instantiated,必須使用accessor來確保它的正確初始化。

* locking

如果引進locking到乙個property裡來管理多執行緒**,直接訪問例項變數將違揹你的lock,並可能導致程式崩潰。

* consistency

在看到前面的內容後,有人可能會說應該只使用accessor,但這使得**很難維護。懷疑和解釋每乙個直接訪問的例項變數,而不是記住哪些需要accessor哪些不需要,這樣使得**更容易審核、審閱和維護。accessor,特別是synthesized accessors,已經在oc裡被高度優化,它們值得使用。

這就是說,你不應該在這幾個地方使用accessor:

* accessor內部

顯然,你不能在accessor內部使用自身。通常,你也不想在getter和setter內部使用它們自己(這可能建立無限迴圈),乙個accessor應該訪問其自身的例項變數。

* dealloc

arc極大地減少了dealloc,但它有時仍會出現。最好呼叫dealloc裡的外部物件,該物件可能處於不一致的狀態,並很可能造成混淆。

* initialization

類似dealloc,物件可能在初始化過程中處於不一致狀態,你不應該在此時銷毀通知或者其他的side effects。

關於OC的property 和 例項變數思考

區別一 property的是可以被外部訪問的,當然也可以定義私有的property,但是例項變數,外部是不可訪問的。所以當我們的變數需要給外部訪問的時候,可以定義property。區別二我們需要儲存我們的資料,不要被提前dealloc的時候,可以使用property的setter,來retain多一...

property的理解和例項

python中有裝飾器的概念,property是裝飾器的一種。以下面的例子進行說明 私有屬性以雙下劃線 開頭 外部不可通過instance.property來訪問或者更改。如果一定要,可以通過setname getname 等方法實現,可是這樣不簡潔。但是,使用 property可以優雅的對私有屬性...

例項變數和類變數

例項變數 instance variable 我們在類內部,方法體外部,用 或不用 private protected public修飾定義 而且沒有static修飾符 的變數稱為 例項變數,即這些變數存放在這個類的每個物件的記憶體空間中,他們之間互不 影響 即對其中乙個物件的例項變數進行修改不會影...