美文网首页
runtime初了解

runtime初了解

作者: 键盘风筝 | 来源:发表于2016-05-24 15:50 被阅读99次

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

    相关文章

      网友评论

          本文标题:runtime初了解

          本文链接:https://www.haomeiwen.com/subject/zbyzrttx.html