上一篇文章说不能加category添加属性,最近作的一个项目恰好有这个需求,google了一下,其实category是有办法添加属性的-_-,并且还有多种方法,在这里总结一下.web
直接在category的.h中添加,这时xcode会有warning。xcode
Property 'test1' requires method 'test1' to be defined - use @dynamic or provide a method implementation in this categoryide
按照提示在.m文件在@dynamic关键字修改就OK了。dynamic在编译时不会检查setter/getter的实现,在运行时setter/getter会动态绑定,在须要setter/getter的class中本身实现就OK了。ui
#import <Foundation/Foundation.h> @interface NSObject (AddProperty1) @property(nonatomic,strong)NSString *test1; @end ---------------------------------------------------------------------- #import "NSObject+AddProperty1.h" @implementation NSObject (AddProperty1) @dynamic test1; @end
(在用这种方法添加proprety,使用setter/getter的class若是不implementation会crash的)this
//只用在.h文件添加协议 #import <Foundation/Foundation.h> @protocol NSObjectProtocol <NSObject> @optional @property(nonatomic,strong)NSString *test3; @end @interface NSObject (AddProperty3)<NSObjectProtocol> @end
同上一种方法同样,在使用setter/getter的class中要implementation,不然会crashgoogle
#import <Foundation/Foundation.h> @interface NSObject (AddProperty2) @property(nonatomic,strong)NSString *test2; @end ---------------------------------------------------------------------- #import "NSObject+AddProperty2.h" #import <objc/runtime.h> @implementation NSObject (AddProperty2) -(NSString*)test2{ return objc_getAssociatedObject(self, @selector(test2)); } -(void)setTest2:(NSString *)test2{ objc_setAssociatedObject(self, @selector(test2), test2, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } @end
利用objctive-c的runtime特性。我的更偏好于第三种方法,改动最小,并且在不知道源码的源码的状况下也能add propertyatom
附上Demo免得之后本身忘记了spa