2011-08-20 197 views
3

是隻更好地創建一個控制或具有屬性在目標c/xcode的實例變量的實例變量?控制最佳實踐

如果您要創建一個屬性,最好使它成爲原子或非原子(用於控件)。

例如,什麼是做得最好的做法如下:

@interface blah 
{ 
    UILabel *label; 
} 

@property (nonatomic, retain) IBOutlet UILabel *label; 

OR

@interface blah 
{ 
    IBOutlet UILabel *label; 
} 

OR

@interface blah 
{  
    UILabel *label; 
} 

@property (retain) IBOutlet UILabel *label; 

後來,當我的dealloc是最好的事情:

[self.label release] 

或 [標籤釋放]

編輯:

所以總結...

  1. 當你的代碼引用控制,你應該使用實例變量
  2. 在dealloc的,你可以通過[iVal發佈]發佈控件\

回答

1

我不會創建ap roperty的標籤,因爲它不需要在UIViewController之外訪問,因此我會使用第二種情況。關於原子性 - 邏輯的事情表明,由於UI應該只從主線程更新,所以UILabel也只能在主線程中訪問。所以,如果你聲明你的財產nonatomicatomic幾乎沒有關係,你只能從主線程訪問和修改那個var。

性能明顯,nonatomic屬性也更快,因爲訪問不需要獲取鎖定。

+0

感謝。所以關於dealloc ...當我有一個屬性,我做[self.propName發佈]或[ival發佈]? – user472292

+0

我還假設對於一個ival,我總是需要在dealloc中釋放並且做[ival發佈] – user472292

+0

當你有一個屬性時,我將它設置爲'nil'。 AFAIK它會自動釋放,不知道。自從我通過實例變量管理它們以來,從未使用過屬性。 – Eimantas

1

如果您使用的界面生成器,然後宣佈

IBOutlet UILabel *label; 

提醒IB有可鏈接的標籤。這允許您使用指針label修改您在IB中創建的標籤。但是,如果標籤永遠不需要修改,那麼根本就不需要聲明它或者引用它。只需在IB中創建它,然後離開它。在這種情況下,不需要getter或setter方法,因此完全不需要使用@property@synthesize

如果您完全以編程方式創建和配置標籤,則無需將其聲明爲IBOutlet。只需使用

UILabel *label; 

然後根據您的代碼調整label。 IB不需要知道它存在。然後創建getter和setter方法,如果你需要它們的話。

1

你想避免在你的dealloc方法中使用方法調用。您可能會遇到一種情況,即您的getter訪問另一個可能已經發布的實例變量。只釋放實例變量更安全。

[label release]; 

如果你決定通過訪問釋放,然後用下面的(由fichek說明):

self.label = nil;