类别的主要作用是扩展功能,也就是添加新的方法,不能对属性进行封装。
如果要添加属性,可以使用关联对象辅助实现
#import "Test.h" @interface Test (Other) @property (nonatomic,strong)NSString *myStr; @end
#import "Test+Other.h" #import <objc/runtime.h> @implementation Test (Other) static const char *omyStr = "omyStr"; -(void)setMyStr:(NSString *)myStr{ objc_setAssociatedObject(self, omyStr, myStr, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -(NSString*)myStr{ return objc_getAssociatedObject(self, omyStr);; } @end
需要注意的是设置方法中的内存管理语义:
关联类型 | 等效的@property属性 |
OBJC_ASSOCIATION_ASSIGN | assign |
OBJC_ASSOCIATION_RETAIN_NONATOMIC | nonatomic, retain |
OBJC_ASSOCIATION_COPY_NONATOMIC | nonatomic, copy |
OBJC_ASSOCIATION_RETAIN | retain |
OBJC_ASSOCIATION_COPY | copy |