轉:Objective-C使用@dynamic和@synthesize

來源:互聯網
上載者:User
文章目錄
  • 動態方法解析

@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
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.