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
- iOS之《Effective Objective-C 2.0》读书笔记(10)
- <iOS读书笔记>之Effective Objective-C 2.0
- iOS之《Effective Objective-C 2.0》读书笔记(1)
- iOS之《Effective Objective-C 2.0》读书笔记(2)
- iOS之《Effective Objective-C 2.0》读书笔记(3)
- iOS之《Effective Objective-C 2.0》读书笔记(4)
- iOS之《Effective Objective-C 2.0》读书笔记(5)
- iOS之《Effective Objective-C 2.0》读书笔记(6)
- iOS之《Effective Objective-C 2.0》读书笔记(7)
- iOS之《Effective Objective-C 2.0》读书笔记(8)
- iOS之《Effective Objective-C 2.0》读书笔记(9)
- iOS之《Effective Objective-C 2.0》读书笔记(11)
- iOS之《Effective Objective-C 2.0》读书笔记(12)
- iOS之《Effective Objective-C 2.0》读书笔记(13)
- iOS之《Effective Objective-C 2.0》读书笔记(14)
- iOS之《Effective Objective-C 2.0》读书笔记(16)
- iOS之《Effective Objective-C 2.0》读书笔记(17)
- iOS之《Effective Objective-C 2.0》读书笔记(21)
- Arduino UNO + esp8266 通信过程记录
- bmon 带宽监视器
- Python- list转数字
- Leetcode135 candy
- Linux cached memory
- iOS之《Effective Objective-C 2.0》读书笔记(10)
- PHPMailer 使用 中文乱码
- Junit覆盖率插件—Eclemma
- java:String使用equals和==比较的区别
- 235. Lowest Common Ancestor of a Binary Search Tree
- P3383 【模板】线性筛素数
- Numpy学习小结(1)
- 时间复杂度和空间复杂度_增强版
- oracle数据库之约束