可能重複:
Properties and Instance Variables in Objective-C 2.0用屬性聲明實例變量或不聲明時有什麼區別?
是什麼,當我使用@property和@synthesize在第一種情況下的差異,@property和@synthesize,也宣告相同的實例變量?因爲兩者似乎都有效。
可能重複:
Properties and Instance Variables in Objective-C 2.0用屬性聲明實例變量或不聲明時有什麼區別?
是什麼,當我使用@property和@synthesize在第一種情況下的差異,@property和@synthesize,也宣告相同的實例變量?因爲兩者似乎都有效。
沒有區別:您聲明的實例變量將被使用,其ARC屬性將被您聲明的這些@property
覆蓋。
屬性的指定所有權保留在其元數據中,否則其含義是純傳統的,除非該屬性是合成的。如果一個屬性被合成,那麼相關的實例變量就是由@synthesize聲明命名的實例變量,可能是隱含的。 如果關聯的實例變量已經存在,則其所有權限定必須等於該屬性的所有權;否則,該實例變量是使用該所有權限制創建的。
聲明的屬性,您打算@synthesize
實例變量,最好避免。如果你喜歡用不同名稱的實例變量,你可以使用合成的語法與伊娃的名字:
@synthesize myproperty = _myivar;
兩個做的工作 - 但是,在新的架構中,如果你聲明一個屬性,你不需要專門聲明一個iVar,因爲它是爲你完成的。
這是首選,確實如此 - 但是,確保如果你聲明瞭兩者,你會意識到何時直接訪問iVar,或者通過getters和setter。
這是個人喜好的問題,但我建議不要顯式聲明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;
+1 - 我敢肯定,你用'_myivar'從'myproperty'區別,但對於新用戶來說,我會指出你顯然希望使用'@synthesize var = _var;'(其中,伊娃與屬性名稱相同,只有前綴爲下劃線)。順便說一下,根據WWDC 2012的視頻,「@ synthesize」語句將來是可選的,在這種情況下,編譯器會使用前面的下劃線爲您聲明ivar。 – Rob 2012-07-16 19:30:50
@RobertRyan感謝您提供即將發佈的資訊!我一直在想,爲什麼編譯器足夠聰明,指出缺少'@ synthesize'指令給我,但不夠聰明,無法插入它們。 – dasblinkenlight 2012-07-16 19:37:05