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..."); }];
相关文章推荐
- iOS之《Effective Objective-C 2.0》读书笔记(2)
- iOS之《Effective Objective-C 2.0》读书笔记(21)
- Chapter 10 手势 iOS 8 -Swift Programming cookBook 读书笔记
- 《Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法》--读书笔记
- iOS-Effective Objective-C 2.0 读书笔记(三)
- iOS之《Effective Objective-C 2.0》读书笔记(43)
- iOS之《Effective Objective-C 2.0》读书笔记(22)
- iOS之《Effective Objective-C 2.0》读书笔记(28)
- iOS之《Effective Objective-C 2.0》读书笔记(49)
- iOS之《Effective Objective-C 2.0》读书笔记(7)
- iOS之《Effective Objective-C 2.0》读书笔记(41)
- iOS之《Effective Objective-C 2.0》读书笔记(44)
- 《Effective Objective C 2.0 编写高质量iOS与OS X代码的52个有效方法》读书笔记
- iOS之《Effective Objective-C 2.0》读书笔记(5)
- iOS之《Effective Objective-C 2.0》读书笔记(51)
- iOS之《Effective Objective-C 2.0》读书笔记(16)
- iOS之《Effective Objective-C 2.0》读书笔记(46)
- 《Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法》读书笔记(上)
- iOS之《Effective Objective-C 2.0》读书笔记(1)
- iOS之《Effective Objective-C 2.0》读书笔记(9)