2012-07-16 114 views

回答

2

沒有區別:您聲明的實例變量將被使用,其ARC屬性將被您聲明的這些@property覆蓋。

屬性的指定所有權保留在其元數據中,否則其含義是純傳統的,除非該屬性是合成的。如果一個屬性被合成,那麼相關的實例變量就是由@synthesize聲明命名的實例變量,可能是隱含的。 如果關聯的實例變量已經存在,則其所有權限定必須等於該屬性的所有權;否則,該實例變量是使用該所有權限制創建的。

聲明的屬性,您打算@synthesize實例變量,最好避免。如果你喜歡用不同名稱的實例變量,你可以使用合成的語法與伊娃的名字:

@synthesize myproperty = _myivar; 
+2

+1 - 我敢肯定,你用'_myivar'從'myproperty'區別,但對於新用戶來說,我會指出你顯然希望使用'@synthesize var = _var;'(其中,伊娃與屬性名稱相同,只有前綴爲下劃線)。順便說一下,根據WWDC 2012的視頻,「@ synthesize」語句將來是可選的,在這種情況下,編譯器會使用前面的下劃線爲您聲明ivar。 – Rob 2012-07-16 19:30:50

+0

@RobertRyan感謝您提供即將發佈的資訊!我一直在想,爲什麼編譯器足夠聰明,指出缺少'@ synthesize'指令給我,但不夠聰明,無法插入它們。 – dasblinkenlight 2012-07-16 19:37:05

1

兩個做的工作 - 但是,在新的架構中,如果你聲明一個屬性,你不需要專門聲明一個iVar,因爲它是爲你完成的。

這是首選,確實如此 - 但是,確保如果你聲明瞭兩者,你會意識到何時直接訪問iVar,或者通過getters和setter。

1

這是個人喜好的問題,但我建議不要顯式聲明ivars。我在這裏看到像這樣,人們做的事情的情況:

@interface MyClass 
{ 
    NSString *var; 
} 
@property (nonatomic, strong) NSString *var; 
@end 

然後

@implementation MyClass 
@synthesize var = _var; 

因此,用戶已經明確地宣佈兩個屬性和名稱相同的伊娃,但然後綜合生成另一個ivar的屬性(在本例中,名稱中帶有前面下劃線的那個),從而生成兩個ivars。然後他們想知道爲什麼他們明確宣佈的伊娃不起作用。如果您沒有明確聲明您的伊娃,那麼您不會有意外結束兩個伊娃的問題,因爲您碰巧在伊娃明確聲明或@synthesize聲明中輸入了該名稱。

只是聲明只有屬性,然後@synthesize使用其他名稱(通常與前面的下劃線)伊娃,這是明確的(即您是不太可能,如果你忘記正確引用屬性var爲引用您的伊娃意外self.var),你永遠不用擔心,例如:

@interface MyClass 
@property (nonatomic, strong) NSString *var; 
@end 

然後

@implementation MyClass 
@synthesize var = _var;