我想向UIView添加一个属性.我知道我可以继承一个UIView但是因为我想添加一个属性我想要扩展它.
我试着这样:
@interface UIView (Util) @property(nonatomic, assign) BOOL isShow; @end @implementation UIView (Util) @dynamic isShow; -(void)setIsShow:(BOOL)isShow{ self.isShow = isShow; } @end
但它不起作用.它引发了一个例外:Thread 1: EXC_BAD_ACCESS(code=2,address,...)
如果要在类别中添加新属性,则必须使用objc_setAssociatedObject
和objc_getAssociatedObject
.
例:
NSString *const IS_SHOW_KEY = @"IS_SHOW"; @interface UIView (Util) @property (nonatomic) BOOL isShow; @end @implementation UIView (Util) - (void)setIsShow:(BOOL)isShow { NSNumber *val = @(isShow); objc_setAssociatedObject(self, (__bridge const void*)(IS_SHOW_KEY), val, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (BOOL)isShow { NSNumber *val = objc_getAssociatedObject(self, (__bridge const void*)IS_SHOW_KEY); return [val boolValue]; } @end
请参阅此处的运行时参考文档:https://developer.apple.com/library/ios/documentation/cocoa/reference/ObjCRuntimeRef/Reference/reference.html