看到交流群里有人在讨论categories能不能添加属性,想了想,iOS有runtime运行时的机制,应该是没问题的。然后查了下资料。解决方案整理如下:
先引入 objc/runtime.h
使用 objc_setAssociatedObject(id object,const void *key,id value,object_AssociationPolicy policy)
,objc_getAssociatedObject(id object,const void *key).动态添加属性跟获取属性。
例子:
先定义一个类
#import <UIKit/UIKit.h>
Person:NSObject
@property(strong,nonatomic) NSString* name;
@implementation Person
定义一个类别
#import "Person.h"
@interface Person(Extention)
static char *PersonSexKey = "PersonSexKey";//定义常量,必须是C语言字符串
-(void)setSex:(NSString *)sex{
/*
OBJC_ASSOCIATION_ASSIGN;//assign策略
OBJC_ASSOCIATION_COPY_NONATOMIC;//copy策略
OBJC_ASSOCIATION_RETAIN;
OBJC_ASSOCIATION_COPY;
objc_setAssociatedObject(id object,const void *key,id value,objc_AssociationPolicy)
参数说明:id object 给哪个对象进行添加属性
const void *key 添加属性的key
id value 设置属性值的value
objc_AssociationPolicy policy 属性策略
*/
objc_setAssociatedObject(self,PersonSexKey,sex,OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(NSString *)sex{
return objc_getAssociatedObject(self,PersonSexKey);
}
@end
P.S:NSString ,如果使用strong属性,则为指针赋值,当NSString对象被NSMutableString赋值时,NSString值会随着NSMutableString修改而修改。所以一般使用copy进行深拷贝。