2011-11-03 78 views
0

我看到一些例子有時會聲明一個屬性以及其他時候它們不會變化的屬性。有一段時間我看到這樣我什麼時候需要同時擁有iVar和財產?

@interface Test : NSObject 
{ 
    UIProgressView* _progressView; 
} 
@property (nonatomic,retain)UIProgressView* progressView; 

@end 

代碼在其他時候,我會遇到

@interface Test : NSObject 

@property (nonatomic,retain)UIProgressView* progressView; 

@end 

爲什麼的原因是什麼?我正在學習,幾乎總是使用屬性和變量。

我已經使用UIProgressView一樣的例子。

+1

除非您在蘋果公司工作,否則請不要在您的伊娃爾名稱上使用單引號下劃線。蘋果公司這樣做是爲了讓他們的名字不會與你的名字相沖突。使用其他的東西。 – NSResponder

+0

Google建議使用尾部下劃線「progressView_」。 C99和蘋果勸阻使用領先的下劃線「_progressView」。但使用前導下劃線看代碼並不罕見,即使Apple在用戶應用程序的模板上使用它。 – Jano

+0

但是使用不同的ivar名稱作爲屬性名稱仍然很好? – Greg

回答

3

這取決於該屬性是否是針對IVAR合成或以某種其它方式衍生的(或對另一IVAR)。

,如果我們有一個類的實例 - 即:

Test *myTest = [[Test alloc] init]; 

那麼基本上財產申報

@property (nonatomic,retain)UIProgressView* progressView; 

告訴任何有興趣使用的界面,他們可以訪問以下兩個功能在此類的一個實例上:

[myTest progressBar]; 
[myTest setProgressBar:aProgressBar]; 

而且客觀C還讓就是你用速記符號:

myTest.progressBar = 
xxx = myTest.progressBar 

這不完全是一回事。

這兩種方法不需要通過與屬性相同的名稱的iVar實現,或者甚至通過iVar(甚至可以執行數據庫獲取或派生值)來實現。

如果您@synthesize屬性(這意味着您希望預編譯器爲您生成上述方法)並且不在@synthesize指令中明確指定iVar,那麼將自動生成上述方法(由於到合成方法)設置或從與屬性相同的名稱的iVar獲取值(並且實現將包括取決於屬性指令的保留/釋放邏輯)

如果你沒有@synthesize財產,那麼你提供你自己的實現,它可以是你想要的東西,它也可以@synthesize的財產,但包括指令使用的方法定義不同的伊娃:

@synthesize progressBar=someOtheriVar; 

在這種情況下,你不會看到相同的名稱,在頭文件的屬性伊娃任。

+0

+1表示可能不會使用ivar實施財產。 – Lukman

6

使用替代性高德如果你想@protected訪問(從只有子類訪問),或支持舊的運行時(這需要兩個)是唯一有用的。

+0

感謝您回覆+1 –

相關問題