做iOS开发有一段
时间了,自己开始整理一些自己的笔记.
记得刚开始工作面试的时候面试官问我''什么是runtime",傻傻的答道就是c转oc的消息机制,虽然那家公司要我了,哈哈.
内心深处一直觉得runtime是一个很牛逼的东西,可望不可以,第一次接触的是mj的JSON转Model,感觉这东西相当好用,最近比较闲,简单的了解一下,省的以后有人问我runtime我也不知道有什么作用.
列举几个用到reuntime的场景
1.交换类方法
Method m1 =class_getClassMethod([Person class],@selector(run));
Method m2 =class_getClassMethod([Person class],@selector(study));
method_exchangeImplementations(m1, m2);
[Person run];
[Person study];
2.截取系统方法,变成自定义的
+(UIImage*)CYZ_imageName:(NSString*)name{
doubleversion = [[UIDevicecurrentDevice].systemVersiondoubleValue];
if(version >=7.0) {
//如果系统版本是7.0以上,使用另外一套文件名结尾是‘_os7’的图片
name = [name stringByAppendingString:@"_os7"];
}
return[UIImage CYZ_imageName:name];
}
+ (void)load {
//获取两个类的类方法
Method m1 =class_getClassMethod([UIImage class],@selector(imageNamed:));
Method m2 =class_getClassMethod([UIImage class],@selector(CYZ_imageName:));
//开始交换方法实现
method_exchangeImplementations(m1, m2);
}
3. 类别添加属性,可以任何一个对象
.h
@property(nonatomic,copy)NSString*name;
.m
char nameKey;
-(void)setName:(NSString*)name{
//将某个值跟某个对象关联起来,将某个值存储到某个对象中
objc_setAssociatedObject(self, &nameKey, name,OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(NSString*)name{
returnobjc_getAssociatedObject(self, &nameKey);
}
4.获取所有成员变量
unsigned int outCount =0;
Ivar *ivars =class_copyIvarList([Person class], &outCount);
for(inti =0; i < outCount; i++) {
Ivarivar = ivars[i];
constchar *name =ivar_getName(ivar);
constchar *type =ivar_getTypeEncoding(ivar);
NSLog(@"成员变量名=%s 成员变量类型=%s",name,type);
}
//注意释放内存
free(ivars);