标签:
runtime(运行时):底层C语言的库,包含很多C语言的API
OC在运行的过程中,都会被编译器编译成runtime运行时C语言
clang -rewrite -objc main.m 会生成main.cpp
作用:
runtime属于OC的底层实现,可以进行一些非常底层的操作(OC无法实现)
1.利用runtime,在程序运行的过程中,动态创建一个类
2.利用runtime,在程序运行过程中,动态的为某个类添加属性/方法,修改属性/方法
3.遍历一个类的所有成员变量
怎么用:
头文件:<objc/runtime>
class_copyIvarList 拷贝成员列表
class_getName 通过类获得名称(C语言字符串)
<objc/message>
objc_msgSend
objc_msgSendSuper
两个常识:
Method 成员方法(函数)
Ivar 成员属性(变量)
应用场景:
1.归档:
-(void)encodeWithCode:(NScode*)coder{
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([PJXDog class],&count);
//class_copyIvarList(NSClassFromString(@"PJXDog"),&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]
}
}
-(instancetype)initWithCoder:(NSCoder *)coder{
if(self = [super init]){
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([PJXDog class],&count);
//class_copyIvarList(NSClassFromString(@"PJXDog"),&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 decoderObjectForKey:ocName];
[self setValue:value forKey:ocName];
}
}
return self;
}
UIKit框架路径: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/UIKit.framework/
2.KVO底层实现原理:利用runtime运行的时候动态创建一个对象, NSKVONotifing_XX类 类名,重新监测对象的set方法(例如:setAge:),调用method:
[self willChangeValueForKey:@"age"]
[self didChangeValueForKey:@:"age"]
标签:
原文地址:http://www.cnblogs.com/PJXWang/p/5520185.html