随笔 - 131  文章 - 0  评论 - 304  阅读 - 341万

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 则不行。
 
posted on   Devin Zhang  阅读(2999)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示