3 回答

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

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

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