2010-11-30 64 views
2

在我從Apple和其他地方在線閱讀的大多數iOS SDK教程中,許多實例變量都是屬性,即使它們只能在自己的類中進行訪問。爲什麼iOS SDK教程中的所有內容都是屬性?

E.G.在Facebook最新的iOS SDK中,鼓勵用戶在應用程序委託中維護一個名爲facebook的Facebook類實例。 facebook"是一個屬性。這在整個示例代碼中被稱爲「self.facebook」。但是,「facebook」屬性不會從應用程序委託之外的任何地方引用。

這是爲什麼?我錯過了什麼?如果實例變量僅用於其自己的類中,我的傾向將是而不是,以使其成爲一個屬性,以便它不是公開可見的,並且在類中將它簡稱爲facebook而不是self.facebookself->facebook

坦率地說,即使我需要facebook屬性,我想我應該在應用程序委託中將它稱爲「facebook」而不是「self.facebook」。

那麼是什麼給?爲什麼我在任何地方看到物業?

回答

7

屬性與iVar是否公開暴露無關。相反,屬性創建訪問器方法來管理保留和促進封裝。

如果您希望私有屬性只需在@private指令下聲明ivar,然後在實現文件中定義屬性。

+0

這是要走的路 - 使用屬性很好,但也很好,不暴露你不想在課堂外使用的屬性。我還會強調你的評論,即財產有助於管理保留。 – 2010-11-30 21:41:35

0

它自動爲您創建getter/setter。 此外,這是一個很好的文章解釋它properties

1

如果你指的是Facebook,那麼它將直接訪問變量,如果你訪問self.facebook,那麼它將通過setter/getter方法。

結果是,如果你需要改變一個對象或稍後在某個時間點,你需要在改變值的過程中做其他事情(比如裝箱),然後你可以把它放在setter方法中,減少在任何地方做到這一點。這是一件好事。

3

通常最好通過訪問者訪問實例變量,而不是直接訪問實例變量。屬性創建這些訪問器,並提供適當的鍵值更改通知和原子訪問等。

3

屬性可以生成getter和setter。特別是Setter可以幫助自動管理對象的保留/釋放計數(半),從而減少某些類型的潛在內存錯誤。

非對象的獲取器和屬性主要針對編碼風格的正交性,儘管它們在將來的擴展或重用代碼中有可能用於增變器,鍵值通知等。

可能存在一些效率差異/缺點,但這取決於使用的特定ObjC運行時間。

+0

+1屬性對於使用鍵值觀察也是必需的。在接口文件(.h)中公開的屬性告訴其他對象如何調用屬性。 – TechZen 2010-11-30 21:10:45

+0

謝謝,很好的答案。 – 2010-12-01 10:51:44

4

一個很好的例子說明爲什麼你應該使用屬性(你可以使屬性爲TechZen指出的私有屬性),在viewDidLoad中創建新的實例。

人們一直這樣做,因爲它每個視圖控制器的實例被調用一次。或者,所以你認爲...在現實中,因爲應用程序獲取內存警告時會發生什麼情況,所以每個實例可以調用多次viewDidLoad類。

因此,例如,你可能會寫這樣的代碼:

- (void) viewDidLoad 
{ myArray = [[NSMutableArray alloc] init]; } 

偉大工程 - 直到它再次呼籲,那麼你有一個泄漏。你可以在你分配之前釋放myArray以防萬一 - 但麻煩在於這是一個容易忘記的步驟。

如果您使用屬性爲每個實例變量雖然,那麼你的代碼看起來是這樣的:

- (void) viewDidLoad 
{ self.myArray = [NSMutableArray array]; } 

現在你不能弄錯了。如果viewDidLoad被多次調用,則舊數組將被釋放,並且新數組將被放置,而不會泄漏舊數組。

相關問題