OC 关联对象

关联对象是指某个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, 推荐使用关联对象作为观察者, 尽量避免对象观察自身

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容