OC 关联对象

2020-12-11  本文已影响0人  mikey_Jiang

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

上一篇 下一篇

猜你喜欢

热点阅读