您的位置:首页 > 移动开发 > Objective-C

iOS之《Effective Objective-C 2.0》读书笔记(10)

2017-08-18 17:40 344 查看

第十条:在既有类中使用关联对象存放自定义数据

1.“关联对象”

(1)定义:某个对象通过一个唯一的key连接到一个类的实例

(2)原理:runtime提供的方法

/** 参数含义:
id object:被关联的对象(如xiaoming)
const void *key:关联的key,要求唯一
id value:关联的对象(如dog)
objc_AssociationPolicy policy:内存管理的策略
*/
// 1>将object和value关联在一起:
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)

// 2>根据key值获取关联对象
id objc_getAssociatedObject(id object, const void *key);

// 3>移除所有关联对象
void objc_removeAssociatedObjects(id object);


(3)关联对象的底层实现:参考

2.两个具体应用

(1)在类目中,为已经存在的类添加属性:以UITabBarController为例

在category中的 @property 并没有为我们生成实例变量以及存取方法,而需要我们手动实现,或者使用 @dynamic 在运行时实现这些方法

// .h   --->使用@property定义
@property (nonatomic, strong) SUCustomTabbar * customTabbar;
// .m   --->添加get/set方法
- (void)setCustomTabbar:(UIView *)customTabbar {

objc_setAssociatedObject(self, @selector(customTabbar), customTabbar, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (UIView *)customTabbar {
return objc_getAssociatedObject(self, @selector(customTabbar));
}
// 具体调用 :
[self.tabBarController.customTabbar XXXXX];


(2)使用block去实现button的点击回调:

// .h
// 1>声明一个button点击事件的回调block
typedef void(^ButtonClickCallBack)(UIButton *button);
// 2>为UIButton增加的回调方法
- (void)handleClickCallBack:(ButtonClickCallBack)callBack;

// .m
// 实现回调方法
- (void)handleClickCallBack:(ButtonClickCallBack)callBack {

objc_setAssociatedObject(self, &buttonClickKey, callBack, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

[self addTarget:self action:@selector(buttonClicked) forControlEvents:UIControlEventTouchUpInside];
}

- (void)buttonClicked {

ButtonClickCallBack callBack = objc_getAssociatedObject(self, &buttonClickKey);

if (callBack) {
callBack(self);
}
}

// 具体调用:
[self.testButton handleClickCallBack:^(UIButton *button) {
NSLog(@"click...");
}];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息