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

来源:互联网 发布:网络映射计算机名 编辑:程序博客网 时间:2024/05/16 00:40

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

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点击事件的回调blocktypedef 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...");}];
阅读全文
0 0
原创粉丝点击