iOS之Runtime
来源:互联网 发布:js调用相机扫描条形码 编辑:程序博客网 时间:2024/06/07 15:13
觉得这个讲的不错,可以去学习一下
http://www.samirchen.com/objective-c-runtime/
下面是我照着写的一些代码:
#import <Foundation/Foundation.h>#import <objc/runtime.h>#import "SubClass.h"#import "SuperClass.h"/* --》通过object_getClass()获取实例sub所属的Class(isa)是SubClass,通过class_getSuperclass()我们可以获取SubClass对应的父类是SuperClass。 --》通过objc_getMetaClass()指定类名,我们可以获取对应的元类,通过class_isMetaClass()我们可以判断一个Class是否为元类,确认后打印元类类名SubClass,打印元类的父类SuperClass。再通过object_getClass()获得元类的isa是NSObject。(元类的isa指针指向根源类) */int main(int argc, const char * argv[]){ @autoreleasepool { //use "object_getClass()" to get "isa" SubClass *sub=[[SubClass alloc]init]; //1.获取指定类的父类:class_getSuperclass(Class cls) NSLog(@"%@ %@",object_getClass(sub),class_getSuperclass(object_getClass(sub))); //2.指定类名,获取对应元类 Class cls=objc_getMetaClass("SubClass"); //3.判断是否是一个元类 if(class_isMetaClass(cls)) { //4.object_getClass()可以获得当前对象的isa(元类的isa指针指向根元类) NSLog(@"%@ %@ %@",cls,class_getSuperclass(cls),object_getClass(cls)); } } return 0;}
#import <Foundation/Foundation.h>#import <objc/runtime.h>#import "SuperClass.h"#import "SubClass.h"/* 1.如下代码中,我们在运行时动态创建了SuperClass的子类:RuntimeSubClass。接着为这个类添加了方法和实现; 2.打印了RuntimeSubClass的类、父类、元类相关信息 3.遍历和打印了RuntimeSubClass的方法的相关信息。 4.调用了RuntimeSubClass的方法 5.最后销毁了实例和类 */int32_t testRuntimeMethodIMP(id self,SEL _cmd,NSDictionary *dic){ NSLog(@"testRuntimeMethodIMP:%@",dic); return 99;}int main(int argc, const char * argv[]){ @autoreleasepool {#pragma clang diagnostic push#pragma clang diagnostic ignored "-Wundeclared-selector" //1.create and register class ,add method to class //objc_allocateClassPair(Class superclasss,const char *name,size_t extraBytes):创建类和元类 Class cls=objc_allocateClassPair(SuperClass.class, "RuntimeSubClass", 0); //class_Method:为类添加方法 class_addMethod(cls, @selector(testRuntimeMethod), (IMP)testRuntimeMethodIMP ,"i@:@"); //注册类到Runtime objc_registerClassPair(cls); //2.create instance of class ,print some info about class and associated meta class id sub=[[cls alloc]init]; NSLog(@"%@ %@",object_getClass(sub),class_getSuperclass(object_getClass(sub))); Class metaCls=objc_getMetaClass("RuntimeSubClass"); if(class_isMetaClass(metaCls)) { NSLog(@"%@ %@ %@",metaCls,class_getSuperclass(metaCls),object_getClass(metaCls)); } //3.methods of class unsigned int outCount=0; //获取方法列表的拷贝,调用用记得free() Method *methods=class_copyMethodList(cls, &outCount); for(int32_t i=0;i<outCount;i++) { Method method=methods[i]; NSLog(@"%@ %s",NSStringFromSelector(method_getName(method)),method_getTypeEncoding(method)); } //print:testRuntimeMethod,i@:@ free(methods); //4.call Method int32_t result=(int)[sub performSelector:@selector(testRuntimeMethod) withObject:@{@"a":@"para_a",@"b":@"para_b"}]; NSLog(@"%d",result);//print:99 //5.Destroy instance and class. //Destroy instance of cls class before destroy cls class sub=nil; //Do not call this function if instance of the cls class or any subclass exists //销毁类和对应的元类 objc_disposeClassPair(cls);#pragma clang diagnostic pop } return 0;}
接下来:
/* 获取一个类的全部成员变量名 */-(void)test1{ unsigned int count; //获得所有的成员变量 Ivar *ivars=class_copyIvarList([JYPerson class], &count); for (int i=0;i<count; i++) { Ivar ivar=ivars[i]; //根据ivar获得成员变量的名称 const char *name=ivar_getName(ivar); //C的字符串转oc的字符串 NSString *key=[NSString stringWithUTF8String:name]; NSLog(@"%d==%@",i,key); } //记得释放 free(ivars);}/* 获取一个类的全部属性名 */-(void)test2{ unsigned int count; //获得该类的所有属性 objc_property_t *properties=class_copyPropertyList([JYPerson class], &count); for(int i=0;i<count;i++) { //获得该类的一个属性的指针 objc_property_t property=properties[i]; //获取属性的名称 const char *name=property_getName(property); //将C的字符串转为OC的字符串 NSString *key=[NSString stringWithUTF8String:name]; NSLog(@"%d==%@",i,key); } free(properties);}/* 获取一个类的全部方法 */-(void)test3{ unsigned int count; //获取该类所有方法 Method *methods=class_copyMethodList([JYPerson class], &count); for(int i=0;i<count;i++) { //获取该类的一个方法的指针 Method method=methods[i]; //获取方法 SEL methodSEL=method_getName(method); //将方法转换为c字符串 const char *name=sel_getName(methodSEL); //将C字符串转为OC字符串 NSString *methodName=[NSString stringWithUTF8String:name]; //获取方法参数个数 int arguments=method_getNumberOfArguments(method); NSLog(@"%d==%@ %d",i,methodName,arguments); } free(methods);}/* 获取一个类遵循的全部协议 */-(void)test4{ unsigned int count; //获取该类遵循的所有协议 __unsafe_unretained Protocol **protocols=class_copyProtocolList([JYPerson class], &count); for(int i=0;i<count;i++) { //获取该类遵循的一个协议 Protocol *protocol=protocols[i]; //获取C字符串协议名 const char *name=protocol_getName(protocol); //C字符串转OC字符串 NSString *protocolName=[NSString stringWithUTF8String:name]; NSLog(@"%d==%@",i,protocolName); } free(protocols);}
2 0
- iOS 笔记之 RunTime
- iOS学习之 - Runtime
- iOS之Runtime
- iOS面试之runtime
- iOS之RunTime浅谈
- IOS---Runtime 之理解
- runtime系列学习之iOS runtime
- iOS之runtime运行机制初探
- iOS开发之关于runtime
- iOS开发之runtime详解
- ios RunTime之方法交换
- iOS runtime 之消息转发
- iOS开发之runtime详解
- iOS之Runtime原理解读
- iOS开发之Runtime初探
- iOS之runtime的简单使用
- iOS开发之旅--揭秘Runtime机制
- iOS runtime方法详解之对象关联
- 送给前线码农的话 - 大牛们的经典语录
- CentOs6.5中安装和配置vsftp简明教程
- Inputreader.cpp里virtualkey的流程
- CODE[VS] 1079 回家
- Java并发编程(一)
- iOS之Runtime
- Java之String中删除指定元素
- HighCharts 详细使用及API文档说明
- kidd风的IOS日志之Source Tree的使用教程
- Python之getopt模块
- AP: average precision
- 3Sum | Java最短代码实现
- python安装教程(Win8环境)
- Codeforces--631A--Interview(位运算)