2014-06-06 81 views
0

例如,在下面的代碼中。什麼時候應該聲明一個實例變量而不是頭中的屬性?

@interface TUTViewController : UIViewController 
{ 
    NSTimer *timer; 
} 
@end 

@interface TUTViewController : UIViewController 

@property (weak, nonatomic) NSTimer *timer; 

@end 

在這情況下我們使用第一種方法來聲明變量?

+3

如果要控制獲取/設置邏輯,則聲明一個屬性。與你擁有的伊娃相當的財產也不會太弱。 –

+1

永遠不要把ivars放在.h中。 ivars應該永遠是私人的意思,他們不屬於公衆.h。如果你創建ivars,把它們放在.m文件中。 – rmaddy

+0

我幾乎從不說。對於objC類型,總是嘗試使用屬性。如果您需要從您的實施中使用伊娃,那麼無論如何您都可以這樣做。 例如,我看到了objC類型,因爲我有使用C++引用作爲屬性的問題。 –

回答

2

你會在這方面得到很多意見,通常表示爲硬性規定。

實施例:

麥迪:不要將實例變量在.H。 ivars應該永遠是私人的 這意味着他們不屬於公衆.h。如果創建實例變量,把 他們在.m文件

我對麥迪非常尊敬,但我不同意他在這一個。

如果你把你的iVars放在你的.m文件中,它們對其他類是隱藏的,但它們也隱藏在你創建的子類中。

我更喜歡將我的實例變量標記爲@protected,這使得它們可用於子類,但不能用於其他類。

其他人會告訴你做一切財產。在ARC之前,將所有對象保存在屬性中是有意義的,因爲您可以使用屬性上的setter來管理對象上的內存。 (當賦值給一個保留屬性時,setter將首先釋放任何舊值,然後保留新值。)現在ARC即使對於iVars也爲你處理,因此使所有屬性成爲屬性的參數較少。

我做的是使一切伊娃,除非:

  1. 我需要一個自定義的getter和setter方法有特殊的行爲。
  2. 我想訪問另一個對象的值。
  3. 我需要將一個屬性標記爲「原子」,以便從另一個線程訪問。 (習慣於將所有屬性聲明爲「非原子」)如果你不知道原子是爲了什麼而需要非原子的,原子屬性比非原子屬性慢。)

作爲政策我絕不會訪問另一個對象的iVar除了通過屬性。

在使用屬性而不是實例變量時,存在一個小而實際的開銷。讀/寫屬性總是進行方法調用。一個iVar直接訪問內存,而不需要方法調用的開銷。通常情況下,差異太小而無關緊要。但是,如果您正在執行數百萬次操作,例如對大圖像中的每個像素執行操作,或者實時處理視頻或音頻採樣的回調,則差異可能很大。

+1

子類不應該有權訪問超類的ivars。它打破封裝。有一個原因,我們無法在我們所有的Apple課程中訪問ivars。事情不會中斷。在你自己的課程中遵循相同的指導原則。受保護的ivars是一個糟糕的設計選擇,使您的班級體系變得脆弱。 – rmaddy

0

我會強烈建議使用@properties,除非有很好的理由不要。誠然,討論不僅僅是技術性的討論,而且因爲我們可能都是Mac邪教組織的追隨者,如果Apple傾向於使用@properties,那麼這就是標準。在我看來,Apple文檔和Xcode都不像在ReSharper中那樣在Visual Studio中執行標準(例如當你不使用var時警告)。這太遺憾了,因爲這會讓我更容易在別人之後拿起代碼。

有一種方法可以在.m文件「隱藏」 @properties,你應該聲明如下:

@interface ABCMySpiffyClass() 

@property (weak, nonatomic) IBOutlet UIImageView *spiffyImage; 
@property (weak, nonatomic) IBOutlet UILabel *spiffyTitle; 

@end 

這些都不是完全私有類的另一種消費,但它是在隱藏第一眼。這應該告訴其他開發者他或她不應該使用它們。我認爲公共/私人更多與文檔有關,因爲它與大多數應用程序的應用程序安全性有關。

相關問題