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
网友评论