2011-03-09 56 views
3

通過「propertyname」訪問屬性與objective-c中的「self.propertyname」之間的nce是什麼?你能否回答這個問題:通過「propertyname」訪問屬性與objective-c中的「self.propertyname」之間的區別?

  1. 什麼是最佳實踐?
  2. 如何做這兩種方式影響內存管理(保留計數/一個對內存管理職責)
  3. 爲場景的假設可以基於以下任何其他優勢/劣勢

頭文件

@interface AppointmentListController : UITableViewController { 
    UIFont *uiFont; 
} 
@property (nonatomic, retain) UIFont *uiFont; 

Implemen塔季翁

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    uiFont = [UIFont systemFontOfSize:14.0]; 
    //VERSUS 
    self.uiFont = [UIFont systemFontOfSize:14.0]; 

感謝

回答

1

使用propertyname剛剛訪問實例變量。您有責任對其內容進行自己的內存管理;沒有保留或發佈爲您執行。

使用self.propertyname通常使用訪問器。如果您使用的是@synthesize,則生成的訪問器將處理您的@property行中指定的內存管理(您給出的示例使用retain,因此在將新值設置爲self.propertyname時將執行保留)。你也可以編寫你自己的訪問器方法來進行管理。

更全面的解釋是在Memory Management Programming Guide。在這種情況下,最佳實踐通常使用@property@synthesize來處理您的變量,然後使用self.propertyname訪問器來減輕您自己的內存管理負擔。本指南還建議您避免使用自定義訪問器(即使用@property而不使用@synthesize)。

+0

我一個人通常命名我的實例變量'_propertyname',所以如果我不小心離開'self.',編譯器會報錯。 – Anomie 2011-03-09 20:22:49

+0

這也是我採用的做法 - 它有助於更​​清楚地區分屬性和實例。 – Tim 2011-03-09 20:23:47

+0

哦,所以如果我目前只是使用propertyname,那麼我需要專門提供一個保留別的風險,然後丟失變量呢?但是,最佳做法是使用訪問器嗎?(有趣的是更詳細) – Greg 2011-03-09 20:24:27

1

附加說明 - 它對iPhone沒什麼用處,因爲在Cocoa Touch中沒有綁定。但是,如果您使用的是Cocoa,則需要注意以下幾點:

鍵值編碼。 KVC是整個Cocoa使用的協議,最顯着的是綁定。它會首先查找您的密鑰的訪問者,並且只能直接訪問數據作爲最後的手段。您可以通過實施訪問者縮短KVC的搜索範圍,從而加快數據訪問速度。

另請注意,如果直接設置實例變量,以var = value的形式,Key-Value Observing不會注意到更改,並且綁定的對象將不會獲得新值。

+0

這實際上與iOS開發相關,因爲那裏的對象確實支持KVC和KVO,儘管有點刪節。感謝您指出! – Tim 2011-03-09 22:46:43

相關問題