3

由於Objective-C的2.0,我們有性質,一個漂亮的語法獲取和實例變量的設定值。自從Clang 3.1以來,所有屬性都是非動態的,不是隻讀的顯式getter或者沒有自定義的getter和setter,自動將合成爲給ivars。並且由於ARC我們有弱/強註釋對於其中使用由ARC定義自動合成性質的存儲器管理邏輯性質。弱/強註解

屬性仍然可以合成手動例如例如,對於由伊娃支持並且返回默認值的只讀屬性。

有時候,屬性也是有用的,如果他們不是在所有的合成。當我使用這種行爲時,我發現了一些用例:

  • 自定義getter和setter,它們使用自定義ivar來存儲實際值並執行一些其他操作。
  • 動態屬性,例如在NSManagedObject的子類中。
  • 只讀屬性,它只是通過存儲在另一個屬性(例如私人屬性)中的對象的屬性。

問題:是否是有意義的根據自己的實際使用情況或不弱/強標註這些非合成的性質?最佳做法是什麼?

https://twitter.com/kubanekl/status/427142577310408704

+2

注意 - 沒有明確的getter方法的只讀屬性可以自動合成。 – rmaddy

+0

@rmaddy謝謝你的提示,我在第二句話中解決了這個問題...... –

回答

6

我想說的答案是肯定的,即使只是爲了文檔。

即使你沒有使用任何與編譯器和框架相關的默認實現,並且自己實現所有事情,有人試圖使用這些屬性將會更好地理解API,如果他能夠得到提示內存管理如何表現。一個人並不需要知道一個setter或getter是如何在內部實現的,但是他可能必須知道,例如,如果在調用setter之後,該值被複制或保留或者只是分配,並且實現他的一面相應的事情。

+1

這完全合理,謝謝。 –

2

是的,它的確如此。

屬性定義是合同規範。僅僅因爲編譯器不履行契約並不意味着在手動實現訪問器方法時不應該尊重它。