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

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 


@interface NSObject (Objc)

@property (nonatomic, strong) NSString *name;

@end

#import "NSObject+Objc.h"

#import 

@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:运行时之动态添加属性(分类中添加))