2013-02-26 40 views
0

我剛剛瀏覽鏈接中的屬性文檔:http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html 「您可以實現自定義訪問器方法」一節描述了屬性並不總是必須由他們自己支持實例變量。 fullName的示例也不使用自己的相應成員。沒有成員在屬性和訪問器方法objective-c

編譯器在定義屬性(_propertyName)時是否隱式創建成員?

回答

0

如果您使用@property創建屬性,則會自動創建ivar,並且其設置者和獲取者由LLVM編譯器創建。

當你創建一個伊娃時,你必須爲它創建一個setter/getter。通常,你可以使用@property並在編譯器上休息。

然而,在某些情況下,您創建伊娃和財產有不同的名稱,並把對它的引用爲:

@synthesize boxDescription=boxName; 

現在boxName是boxDescription訪問,現在你不能在你的代碼中使用boxDescription

+0

感謝您的答覆覆蓋此品行。我的問題是不同的。假設我在頭文件中聲明瞭@property(nonatomic)NSString * fullName,並且我沒有爲fullName聲明任何成員。在源文件中,我不寫綜合fullName並實現訪問器方法fullName {return [NSString stringWithFormat:@「myFirstName」,@「」,@「myLastName」]}。在這種情況下,編譯器會自動定義一個成員_fullName? – spd 2013-03-07 07:12:40

+0

如果你使用新的編譯器,只寫'@property(nonatomic)NSString * fullName'會爲它創建setter/getter,它默認爲'_fullName'。所以你通過創建你的訪問器來重寫。 – 2013-03-07 07:27:03

0

如果您重寫默認的setter和getter,並且不提供@synthesize(以及您不訪問_ivar),編譯器將不爲您創建任何變量。在這種情況下,你有一個財產不支持伊娃。

一個很隨便舉個例子:

 
@property (nonatomic) int x; 

- (int)x 
{ 
    return 1; 
} 

- (void)setX:(int)x 
{ 
    NSLog(@"%d", x); 
} 

更userfull使用可以,如果你有其他類的門面,並使用此setter /吸氣設置/得到這些。

的情況下,你不覆蓋set/getter和現在@synthesize是不再強制默認情況下,編譯器創建一個名爲伊娃_propertyname,您可以通過@synthesize prop_name=ivar_name

+0

這是拼寫@synthesize。我糾正了它。 – Cthutu 2013-02-26 14:50:26

相關問題