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
原创粉丝点击