Runtime初体验

2017-01-24  本文已影响9人  Coder东

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

上一篇 下一篇

猜你喜欢

热点阅读