美文网首页iOS 精美收藏iOS技能iOS
iOS分类中通过runtime添加动态属性

iOS分类中通过runtime添加动态属性

作者: 奋斗的菜鸟 | 来源:发表于2015-08-11 17:50 被阅读12731次
    • 首先定义一个类
    #import@interface Person : NSObject
    @property (assign, nonatomic) NSInteger age;
    -(void)run;
    @end
    
    #import "Person.h"
    @implementation Person
    -(void)run{
        NSLog(@"%s",__func__);
    }
    @end
    
    • 定义分类
    #import "Person.h"
    @interface Person (PersonExtention)
    @property (copy, nonatomic) NSString *name;
    -(void)saySex;
    @end
    #import "Person+PersonExtention.h"
    #import <objc/runtime.h>
    @implementation Person (PersonExtention)
    //定义常量 必须是C语言字符串
    static char *PersonNameKey = "PersonNameKey";
    -(void)setName:(NSString *)name{
        /*
        OBJC_ASSOCIATION_ASSIGN;            //assign策略
        OBJC_ASSOCIATION_COPY_NONATOMIC;    //copy策略
        OBJC_ASSOCIATION_RETAIN_NONATOMIC;  // retain策略
    
        OBJC_ASSOCIATION_RETAIN;
        OBJC_ASSOCIATION_COPY;
         */
         /*
         * id object 给哪个对象的属性赋值
           const void *key 属性对应的key
           id value  设置属性值为value
           objc_AssociationPolicy policy  使用的策略,是一个枚举值,和copy,retain,assign是一样的,手机开发一般都选择NONATOMIC
              objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
         */
    
        objc_setAssociatedObject(self, PersonNameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
    }
    -(NSString *)name{
        return objc_getAssociatedObject(self, PersonNameKey);
    }
    -(void)saySex{
        NSLog(@"%s----%@",__func__,self);
    }
    
    @end
    

    总结:在分类中@property不会生成_变量,也不会实现getter和setter方法,我们可以手动实现如下

    -(NSString *)name{
        return @"name";
    }
    -(void)setName:(NSString *)name{
        
    }
    

    但是这样是没什么意义的,而且分类中不允许定义变量,所以只能用runtime类实现

    相关文章

      网友评论

      • LD_左岸:请教下 这个Runtime的动态添加属性 有什么特殊的应用场景吗 就是非得这么干不能解决问题

        我觉得搞个子类 也是很简单的啊

        比如我给系统类UIButton 搞个分类 在分类里再@property一个属性 此时明明是不生成该属性的下划线变量 也不生成该属性的set get方法 自己用RunTime费劲巴列的给他整上

        何如直接继承自UIButton @property(nonatomic,copy)NSString * XXX;
        一句代码就OK嘛
      • IMKel:如何是布尔类型的,能添加吗
        奋斗的菜鸟:@IMKel 可以添加,策略选择OBJC_ASSOCIATION_ASSIGN,伪代码objc_setAssociatedObject(实例对象, "key", @(布尔值), OBJC_ASSOCIATION_ASSIGN)
      • 动感超人丶:如果 添加的属性是自定义的,会崩溃,怎么解决,比如给NSPerson添加NSDog属性,而不是NSString
      • 兰州一碗面:屌屌屌,学习了谢谢大神
        奋斗的菜鸟:@兰州一碗面 不敢当不敢当,只是把自己理解的写出来而已
      • 会当临绝顶山小:以前还真不知道这个,又长见识了……
      • codeing小牛:不错不错
      • 屈涯:写的不错,终于找到写的能看懂的了
      • 我是卖报滴小行家:没有看太懂,到底用的是分类还是延展啊?
        我是卖报滴小行家:@srowfly 鲸鱼?
        奋斗的菜鸟:@我不爱白开水 是Category,名字叫Extension,这里可能有点歧义,以后我会改正
        dc4f4e889415:@我不爱白开水 分类的名字叫Extension...

      本文标题:iOS分类中通过runtime添加动态属性

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