2012-10-24 9 views
2

我想知道到底有什麼用(取)訪問讀取屬性的值,並直接使用伊娃之間的區別是什麼?目標C - 使用屬性get訪問VS直接使用伊娃

說我有一類聲明的屬性:

@interface Foo : NSObject 

@property (strong) NSString *someString; 

@end 

而在執行我使用它。以下兩行之間是否有區別:

someLabel.text = self.someString; 

someLabel.text = _someString; 

對於set訪問器很明顯。 Afaik強大的屬性訪問者照顧保留和釋放(一個有趣的'側面問題'將是,如果ARC改變,即直接設置iVar [假設它不是__weak iVar]也保留並正確使用ARC發佈),也KVO需要使用訪問器才能正常工作等等。但是,獲取者呢?

如果有什麼區別,有認爲是最佳做法的一種方式?

THX

回答

4

如你所知,調用self.someString真是[self someString]。如果您選擇創建屬性,那麼您應該使用該屬性。可能會有其他語義添加到該屬性。也許該屬性是延遲加載。也許該物業不使用伊娃。也許有一些其他需要的副作用來調用屬性的getter。也許現在不是,但也許這是未來的變化。現在調用該屬性使您的代碼更具前瞻性。

如果您有伊娃和屬性,使用該屬性,除非你有明確的理由來使用,而不是伊娃。可能會出現這樣的情況:您不希望執行屬性的任何額外語義或副作用。所以在這種情況下,直接使用伊娃是更好的。

但最終,它是你的代碼,你的財產,你的伊娃。你知道爲什麼你添加了一個屬性。你知道該財產的任何潛在利益,如果有的話。

2

我想這是你在找什麼。 Why use getters and setters?

實際上有很多很好的理由要考慮使用訪問器,而不是直接暴露一個類的字段 - 除了封裝的參數以及使未來的更改更容易。

下面是一些我知道的原因:與獲取或設置 屬性相關聯的行爲

  • 封裝 - 這允許附加功能(如驗證)來 更容易在以後添加。
  • 隱藏 屬性的內部表示,同時暴露使用替代 表示一個屬性。
  • 絕緣的公共接口的變化 - 允許公共接口,使其既不會影響現有的消費者 實現更改不變。
  • 控制屬性的生命週期和內存管理(處置)語義 - 在非管理內存環境(如C++或Objective-C)中非常重要。
  • 提供調試 當屬性在運行時更改時的攔截點 - 調試 何時何處屬性更改爲特定值可能相當困難 如果沒有在某些語言中使用此選項,將會非常困難。
  • 改進的互操作性 與設計爲針對財產操作的庫 getter/setters - 想到模擬,序列化和WPF。
  • 允許繼承者通過覆蓋getter/setter方法來更改屬性 的行爲方式和公開方式的語義。
  • 允許getter/setter作爲lambda表達式 傳遞,而不是值。
  • 獲取者和設置者可以允許不同的訪問級別 級別 - 例如get可能是公開的,但該設置可能是 受保護。
+1

感謝您的詳細解釋,但我的問題不是爲什麼使用訪問器,而是如果我已經有一個屬性(私人或公共無所謂)使用getter(自我。 someProperty)和使用iVar(_someProperty)。但thx無論如何:) – Tobi

+2

噢好吧。瞭解。沒有重大區別。只有方便之處在於,在稍後的時間點,只要有人試圖訪問它,就可以重新實現您的getter添加一些新功能。在稍後的階段中,您要在控制檯中打印值,只要有人訪問您的參數,但參數在您的代碼中隨處可見。在這種情況下,你只需要在類中實現你的getter方法。自動執行的任何內容都可以在其他地方正常工作。 – iDev

1

我不是一個非常有經驗的人來回答這個問題,即使我試圖通過看到年齡在10歲左右的源代碼來給出我的觀點和我的經驗。

在之前的代碼中,他們創建了ivars和property/synthesise。現在只有財產/綜合使用。我看到的一個好處是代碼少,沒有混淆。

混亂!!!是的,如果ivars和它的財產名稱不同,那麼如果您在一段時間後閱讀自己的代碼,它確實會給其他人甚至是您造成困惑。所以使用一個名稱爲伊娃和財產。

通過使用屬性KVO/KVB/KVC自動處理,這是肯定的。

@財產/ @合成設置您伊娃0 /零等

也是有幫助的,如果你的子類包含同樣的伊娃。

對於可變對象不要使屬性。