文章目錄
@dynamic 意思是由開發人員提供相應的代碼:對於唯讀屬性需要提供 setter,對於讀寫屬性需要提供 setter 和 getter。
@synthesize 意思是,除非開發人員已經做了,否則由編譯器產生相應的代碼,以滿足屬性聲明。
查閱了一些資料確定@dynamic的意思是告訴編譯器,屬性的擷取與賦值方法由使用者自己實現, 不自動產生。
@dynamic just tells the compiler that the getter and setter methods are implemented not by the class itself but somewhere else (like the superclass)
再看蘋果官方文檔說明似乎更有意思 :
動態方法解析 有時候,您需要動態地提供一個方法的實現。例如,Objective-C中屬性(Property)(參考Objective-C 2.0 程式設計語言中屬性小節)前的修飾符@dynamic @dynamic propertyName;表示編譯器須動態地產生該屬性對應地方法。 您可以通過實現resolveInstanceMethod:和resolveClassMethod:來動態地實現給定選標的對象方法或者類方法。 Objective-C方法可以認為是至少有兩個參數——self和_cmd——
的C函數。您可以通過class_addMethod方法將一個函數加入到類的方法中。例如,有如下的函數: void dynamicMethodIMP(id self, SEL _cmd) { // implementation ….}您可以通過resolveInstanceMethod:將它作為類方法resolveThisMethodDynamically的實現: @implementation MyClass+ (BOOL)resolveInstanceMethod:(SEL)aSEL{ if (aSEL == @selector(resolveThisMethodDynamically)) { class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP, "v@:"); return YES; } return [super resolveInstanceMethod:aSEL];}@end通常訊息轉寄(見 “訊息轉寄”)和動態方法解析是互不相干的。在進入訊息轉寄機制之前,respondsToSelector:和instancesRespondToSelector: 會被首先調用。您可以在這兩個方法中為傳進來的選標提供一個IMP。如果您實現了resolveInstanceMethod:方法但是仍然希望正常的訊息轉寄機制進行,您只需要返回NO就可以了。 在Aaron Hillegass寫的Cocoa programming for Mac OS X中30章的Department.m中也運用了Dynamic方法,即Key-Value Coding方法實現的。 來源:http://blog.sina.com.cn/s/blog_6f92e3580100zx5s.html