当前位置:首页 > 操作系统 > Ios

iOS运行时编程(Runtime Programming)和Java的反射机制对比

原文链接:http://www.cnblogs.com/devinzhang/p/4576454.html 运行时进行编程,类似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 则不行。 ?

转载于:https://www.cnblogs.com/devinzhang/p/4576454.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!