关联对象是指某个OC对象通过一个唯一的key连接到一个类的实例上.
举个栗子: mikey是Person类的一个实例, 他的dog0(Dog类的一个OC对象)被mikey的一个绳子(key)牵着散步, mikey和dog0是关联起来的, 当然, mikey还可以牵着dog1,dog2...
应用场景:
1.添加公共属性
可以通过分类自定义一个tabbar, 并暴露公共的属性和方法, 方法可以直接定义, 属性的部分就需要通过runtime的关联对象来添加
2.添加私有成员变量
在分类中添加不想暴露在公共声明中的成员变量.例:
给按钮分类添加点击时间的回调
@interface UIButton(Callback)
-(instancetype)initWithFrame:(CGRect)frame callback:(void(^)(UIButton*))callbackBlock;
@end
@interface UIButton()
@property(nonatomic,copy)void(^callbackBlock)(UIButton*button);
@end
@implementationUIButton(Callback)
-(void(^)(UIButton*))callbackBlock{
returnobjc_getAssociatedObject(self,@selector(callbackBlock));
}
-(void)setCallbackBlock:(void(^)(UIButton*))callbackBlock{
objc_setAssociatedObject(self,@selector(callbackBlock),callbackBlock,OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(instancetype)initWithFrame:(CGRect)frame callback:(void(^)(UIButton*))callbackBlock{
if(self=[superinitWithFrame:frame]){
self.callbackBlock=callbackBlock;
[self addTarget:selfaction:@selector(didClickAction:)forControlEvents:UIControlEventTouchUpInside];
}
return self;
}
-(void)didClickAction:(UIButton*)button{
self.callbackBlock(button);
}
@end
3.关联KVO观察者
我们在分类中使用KVO, 推荐使用关联对象作为观察者, 尽量避免对象观察自身