3 回答

TA貢獻1833條經(jīng)驗 獲得超4個贊
@synthesize將為您的屬性生成getter和setter方法。@dynamic只是告訴編譯器,getter和setter方法不是由類本身實現(xiàn)的,而是由其他地方實現(xiàn)的(例如超類或?qū)⒃谶\行時提供)。
@dynamic的使用例如是NSManagedObject(CoreData)的子類,或者當(dāng)您要為由超類定義的屬性(未定義為插座)創(chuàng)建插座時。
@dynamic也可以用于委派實現(xiàn)訪問器的責(zé)任。如果您在類中自己實現(xiàn)訪問器,則通常不使用@dynamic。
超類:
@property (nonatomic, retain) NSButton *someButton;
...
@synthesize someButton;
子類:
@property (nonatomic, retain) IBOutlet NSButton *someButton;
...
@dynamic someButton;

TA貢獻2016條經(jīng)驗 獲得超9個贊
看一下這篇文章 ; 在“運行時提供的方法”標(biāo)題下:
一些訪問器是在運行時動態(tài)創(chuàng)建的,例如CoreData的NSManagedObject類中使用的某些訪問器。如果要聲明和使用這些情況下的屬性,但又希望避免在編譯時對方法丟失的警告,則可以使用@dynamic指令而不是@synthesize。
...
使用@dynamic指令實際上告訴編譯器“不用擔(dān)心,一種方法即將出現(xiàn)?!?/p>
@synthesize另一方面,該指令在編譯時為您生成訪問器方法(盡管如“混合的綜合和自定義訪問器”一節(jié)中所述,它很靈活,如果實現(xiàn)了兩者,則不會為您生成方法)。

TA貢獻2036條經(jīng)驗 獲得超8個贊
正如其他人所說,通常,您使用@synthesize來讓編譯器為您生成getter和/或設(shè)置,如果要自己編寫,則使用@dynamic。
還沒有提到另一個微妙之處:@synthesize 將允許您自己提供getter或setter的實現(xiàn)。如果您只想為一些額外的邏輯實現(xiàn)getter,但讓編譯器生成setter(對于對象,編寫自己通常要復(fù)雜一點),這將很有用。
但是,如果您確實為@synthesize訪問器編寫了一個實現(xiàn),則該實現(xiàn)仍必須由實數(shù)字段來支持(例如,如果編寫,則-(int) getFoo();
必須具有一個int foo;
字段)。如果該值是由其他值產(chǎn)生的(例如,從其他字段計算得出),則必須使用@dynamic。
- 3 回答
- 0 關(guān)注
- 886 瀏覽
添加回答
舉報