iOS運行時編程(Runtime Programming)和Java的反射機制對比


運行時進行編程,類似Java的反射。運行時編程和Java反射的對比如下:
 
1.相同點
  都可以實現的功能:獲取類信息、屬性設置獲取、類的動態加載(NSClassFromString(@“className”))、方法的動態調用
 
 下面是iOS中涉及到的相關使用方法
 
  類的動態加載:NSClassFromString(@“className”), 方法的動態調用: NSSelectorFormString(@”doSonethingMethod:”)
 
  常見的方法:
  isKindOfClass: isMemberOfClass:  ; respondsToSelector:   ; conformsToProtocol:  ; methodForSelector: (提供實現方法的地址) 
 
  給對象發消息的格式:[receiver message]
  objc_msgSend(receiver,selector)
  objc_msgSend(receiver,selector,arg1,arg2,...)
 
  動態方法解決:@dynamic propertyName;
 
  消息轉發: 消息negotiate負責轉發
  - negotiate
  {
      if ( [someOtherObject respondsTo:@selector(negotiate)] )
          return [someOtherObject negotiate];
      return self;
  }
 
2.不同點:objective-c能動態的給class添加類和方法,Java 則不行。例如:
 
下面是iOS中涉及到的相關使用方法
 
 API(#import<objc/runtime.h>)
 
 Class newClz =objc_allocateClassPair([NSError class],”RuntimeErrorSubclass”,0);
 
 class_addMethod(newClz,@selector(retort), (IMP)ReportFunction, “v@:”);
shiyongobjc_allocateClassPair動態函數創建一個類,並在參數中指明該類的父類和類名。用class_addMethod函數為該類增加了一個方法report,這個方法是由函數ReportFunction實現的,由於該函數至少應包含兩個參數self和_cmd,因此該方法有3個參數,類型分別為v、@、:(一個返回值,self,_cmd)。
 
3.深層次對比
 
動態機制:Objective-C runtime 對 class method 的調用是通過全局名稱查詢。而 Java VM 是通過類似 C++ 的虛表機制。所以 Objective-C 能動態的給 class 添加方法,Java 則不行。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM