美文网首页
知识点33:运行时之动态添加属性(分类中添加)

知识点33:运行时之动态添加属性(分类中添加)

作者: 枫之叶_小乙哥 | 来源:发表于2017-02-15 02:15 被阅读19次

    2.动态添加属性

    • 1.原理:给一个类声明属性,其实本质就是给这个类添加关联(即将值的地址关联给类的属性,不是在类中创建对象),并不是直接把这个值的内存空间添加到类存空间。

    用途:
    - 1.页面传值
    - 2.统一添加属性,方便管理,如:友盟页面统计时,传入的页面名称.

    • 2.控制器中
    // 控制器中
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        NSObject *objc = [[NSObject alloc] init];
        // 实质调用了objc的set方法(name是分类动态添加的属性)
        objc.name = @"123";
        NSLog(@"%@",objc.name);
        
        
    }
    
    • 3.NSObject的分类中
    // .h文件
    #import <Foundation/Foundation.h>
    
    
    @interface NSObject (Objc)
    
    @property (nonatomic, strong) NSString *name;
    
    @end
    
    
    #import "NSObject+Objc.h"
    
    #import <objc/message.h>
    
    @implementation NSObject (Objc)
    
    //static NSString *_name;
    
    // 定义关联的key
    static const char *key = "name";
    
    - (void)setName:(NSString *)name
    {
        // 添加属性,跟对象
        // 给某个对象产生关联,添加属性
    
        // object:给哪个对象添加属性
        // key:属性名,根据key去获取关联的对象 ,  void * == id
        // value:关联的值
        // policy:策略
        // 方法一:
    //    objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
        // 方法二:
    //    objc_setAssociatedObject(self, key, name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
        // 方法一三:
        objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    
    //    _name = name;
    }
    
    - (NSString *)name
    {
        // 方法一:
    //    return objc_getAssociatedObject(self, @"name");
        // 方法二:
    //    return objc_getAssociatedObject(self, key);
        // 方法三:
        return objc_getAssociatedObject(self, _cmd);
    
    }
    
    @end
    
    

    相关文章

      网友评论

          本文标题:知识点33:运行时之动态添加属性(分类中添加)

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