runtime初了解

做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);

推荐阅读更多精彩内容