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
网友评论