Runtime初体验

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容