1

在現代運行時。 你可以在無需已經宣佈在接口 像在類接口中的ivar和由聲明的屬性(現代運行時)創建的ivar之間有任何區別嗎?

@interface MyClass: NSObject 
{ 
    NSString *str2; 
} 
@property (retain) NSString *str1; 
@property (retain) NSString *str2; 
@end 

同名伊娃財產申報同時我也知道,這會因爲在執行自動爲你生成一個STR1伊娃,你可以同時訪問self.str1或純粹str1

但我的問題是,str1和str2之間有什麼區別嗎?

如果它們相同,爲什麼類擴展(沒有名字的類)允許添加一個新的聲明屬性,它也會生成一個ivar,但不允許在類擴展中添加一個ivar實例?(我知道LLVM 2.0或更高版本允許這但海灣合作委員會不要)

回答

0

str1和str2是相同的,因爲當你使用@property setter和getter方法是自動生成的,但也創建了一個實例變量,如果沒有以前存在的一個存儲值。例如,在你的代碼中,編譯器會說:「看來我必須創建一個NSString類的實例,因爲程序員想要訪問它。」但是對於str2,已經創建了一個實例變量來存儲數據,因此編譯器不需要創建一個實例變量。

就我個人而言,我使用str1編寫代碼,而不是在@interface中聲明變量。

希望這會有所幫助。

還檢查了這一點:What's the purpose of an ivar when a property exists?

+0

這不是財產指令,但'@ synthesize'創建變量:http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjectiveC /Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW9 – 2012-06-04 04:13:33

相關問題