美文网首页
Runtime初体验

Runtime初体验

作者: Coder东 | 来源:发表于2017-01-24 14:04 被阅读9次

    Runtime介绍:

    runtime官方文档字面翻译:ios中的黑魔法!!!

    runtime(运行时):底层C语言的库。包含了很多的C语言的API

    概念:OC在运行的过程中,都会被编译器编译成runtime运行时C语言。。

    有什么用:runtime属于OC的底层实现,可以进行一些非常底层的操作(OC无法实现)

    1.利用runtime在程序运行的过程中动态创建一个类

    2.利用runtime,在程序运行的过程中,动态的为某个类添加属性/方法,修改属性/方法

    3.遍历一个类的所有成员变量

    怎么用:

    头文件:    <objc/runtime>

    class_copyIvarList   拷贝成员变量

    class_getName  通过类获得(C语言字符)名称

    <objc/message>

    objc_msgSend   

    objc_msgSendSuper 

    两个常识:

    |----Method   成员方法

    |----Ivar          成员属性(变量)

    应用场景:归档!

    KVO:底层实现原理:利用runtime运行时的时候动态添加创建一个对象,NSKVONotifng_XX类  类名  重写 SetAge方法

    [self willChangeValueForKey:@"age"];

    [self didChangeValueForKey:@"age"];

    unsigned int count = 0;//属性个数!!!

    //    unsigned int * cut = &count;

    //拷贝成员列表!!

    Ivar * ivars = class_copyIvarList( NSClassFromString(@"Person"), &count);

    Ivar ivar = ivars[0];

    const char * name = ivar_getName(ivar);

    NSString * ocName = [NSString stringWithUTF8String:name];

    NSLog(@"%@",ocName);

    @interface Person : NSObject

    @property(copy,nonatomic) NSString *name;

    @property(assign,nonatomic)NSInteger age;

    end

    @interface Person ()<NSCoding>

    @property (nonatomic,strong)UIImage *image;

    end

    @implementation Person

    -(void)encodeWithCoder:(NSCoder *)coder{

    //归档

    unsigned int count = 0;//属性个数!!!

    Ivar   *ivars = class_copyIvarList ( [self class], &count);

    for (int i =0 ; i < count ;i ++){

    Ivar  ivar = ivars[i];

    const char *name = ivar_getName(ivar);

    NSString *ocName = [NSString stringWithUTF8String:name];

     [coder encodeObject:[self valueForKey:ocName] forKey:ocName];

    }

    //在C语言里面一旦用到了create new copy 就需要释放

    free(ivars);

    }

    -(instancetype)initWithCoder:(NSCoder *)coder{

    if(self = [super init]){

    //解档 

    unsigned int count = 0;//属性个数!!

    Ivar *ivars = class_copyIvarList( [ self class],&count);

    for(int i = 0; i< count; i++){

    Ivar ivar = ivars[i];

    const char *name = ivar_getName(ivar);

    NSString *ocName = [NSString stringWithUTF8String:name];

    id value = [coder decodeObjectForKey:ocName];

    [self setValue:value forKey:ocName];

    }

    free(ivars);

    }

    return self;

    }

    end

    相关文章

      网友评论

          本文标题:Runtime初体验

          本文链接:https://www.haomeiwen.com/subject/pgqabttx.html