原理: 给一个类声明属性,其实本质给这个类添加关联,并不是直接把这个值的内存空间添加到类的内存空间.
应用场景:给系统的类或第三方框架的类添加属性.
需求:给系统NSObject类添加字符串name属性.
1.创建分类NSObject + Add;
- 在.h文件中
#import <Foundation/Foundation.h>
@interface NSObject (Add)
@property(nonatomic,copy)NSString *name;
@end
- 在.m文件中
#import "NSObject+Add.h"
#import <objc/runtime.h>
#import <objc/message.h>
@implementation NSObject (Add)
- (void)setName:(NSString*)name
{ // objc_setAssociatedObject(将某个值跟某个对象关联起来,将某个值存储到某个对象中)
// object:给哪个对象添加属性// key:属性名称// value:属性值// policy:保存策略
objc_setAssociatedObject(self,@"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString*)name
{
return objc_getAssociatedObject(self,@"name");
}
@end
2.调用
#import "NSObject+Add.h"
NSObject *objc = [[NSObject alloc]init];
objc.name = @"xwx";
NSLog(@"动态给NSObject添加的属性为%@",objc.name);