美文网首页iOS Developer
iOS利用runtime给分类添加属性

iOS利用runtime给分类添加属性

作者: 李二侠 | 来源:发表于2017-07-05 15:16 被阅读52次

    在项目开发中,有时候会觉得某些类属性不够用或者想给一些类添加属性,例如给UIImageView添加一个name的属性,用来给UIImageView取名字(这里只是举例子,实际情况根据自己需要添加)。
    一般情况下我们可以通过写一个类继承UIImageView,然后给这个类添加一个name属性既可,但是如果只是多添加一个属性就重新写一个类的话,总感觉略显麻烦,毕竟有时候还是习惯用系统的UIImageView。这个时候我们就可以利用runtime在UIImageView的分类里面创建了。

    1.首先创建一个UIImageView的分类:


    屏幕快照 2017-07-05 下午2.36.09.png

    2.在.h声明一个name的属性:


    屏幕快照 2017-07-05 下午2.39.17.png
    如果不在.m文件里用runtime做一些处理,在controller里面直接如下
    屏幕快照 2017-07-05 下午2.42.41.png

    使用这个name属性的话(ps:使用之前要导入"UIImageView+newProperty.h"),程序会崩溃。

    3.为了能够正常使用这个属性,runtime就登场了。在UIImageView+newProperty.m中导入#import <objc/runtime.h>

    先声明一个key值,下面会用到

    static char * nameKey = "nameKey";
    
    #pragma mark 动态添加新属性,需要手动实现setter和getter方法
    /*
     
     id object:一般在分类中创建属性,直接写self即可
     const void *key:给这个属性独一无二的一个key值,一般用创建的key的地址即可或者也可以直接用这个声明的key
     id value:就是你声明的name属性
     objc_AssociationPolicy :点击源文件,里面的几个类型应该都能看的懂吧,根据自己声明的属性进行适当的选择
    
     objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
     
     */
    - (void)setName:(NSString *)name
    {
        //将name和其对应key关联起来
        objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
    }
    
    - (NSString *)name
    {
        //根据key值对到对应value
        return objc_getAssociatedObject(self, &nameKey);
    }
    

    4.做完这些之后,就可以在需要的地方引用了。
    例如:

     UIImageView * imgView = [UIImageView new];
     imgView.name = @"路飞";
    

    这样就可以给UIImageView取名字了,当然实际要根据自己的需要添加

    相关文章

      网友评论

        本文标题:iOS利用runtime给分类添加属性

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