什么是Associative?
Objective-C有两个扩展机制:category和associative。我们可以通过category来扩展方法,但是它有个很大的局限性,不能扩展属性。于是,就有了专门用来扩展属性的机制:associative。
使用方法
在iOS开发过程中,category比较常见,而associative就用的比较少。associative的主要原理,就是把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分。
使用associative,我们可以不用修改类的定义而为其对象增加存储空间。这在我们无法访问到类的源码的时候或者是考虑到二进制兼容性的时候是非常有用。
associative是基于关键字的。因此,我们可以为任何对象增加任意多的associative,每个都使用不同的关键字即可。associative是可以保证被关联的对象在关联对象的整个生命周期都是可用的。
associative机制提供了三个方法:
//设置关联
OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
//获取关联对象
OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key)
//移除所有关联
OBJC_EXPORT void objc_removeAssociatedObjects(id object)
创建associative
创建associative使用的是:objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
。它把一个对象与另外一个对象进行关联。
该函数需要四个参数:
被关联的对象,下面举的例子中关联到了UIAlertView
要关联的对象的键值,一般设置成静态的,用于获取关联对象的值
要关联的对象的值,从接口中可以看到接收的id类型,所以能关联任何对象
关联时采用的策略,有assign,retain,copy等协议,具体可以参考官方文档关键字是一个void类型的指针。每一个关联的关键字必须是唯一的。通常都是会采用静态变量来作为关键字。
它的枚举包括:OBJC_ASSOCIATION_ASSIGN = 0, OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, OBJC_ASSOCIATION_COPY_NONATOMIC = 3, OBJC_ASSOCIATION_RETAIN = 01401, OBJC_ASSOCIATION_COPY = 01403
关联策略表明了相关的对象是通过赋值,保留引用还是复制的方式进行关联的;还有这种关联是原子的还是非原子的。这里的关联策略和声明属性时的很类似。这种关联策略是通过使用预先定义好的常量来表示的。
下面就以UIAlertView为例子,在点击Button时,弹出AlertView,点击”好的”按钮,就会获取到Button的名称
首先要使用objc_setAssociatedObject
必须导入#import <objc/runtime.h>
创建静态关键字 static const char associatedButtonkey
- 通过objc_setAssociatedObject这个函数,把alertView和sender关联起来
objc_setAssociatedObject(alertView, &associatedButtonkey, sender,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- 通过 objc_getAssociatedObject获取关联对象
objc_getAssociatedObject(alertView, &associatedButtonkey);
下面就直接上代码:
#import <objc/runtime.h>
static const char associatedButtonkey;
@interface ViewController ()
@end
@implementation ViewController
- (IBAction)btnClick:(id)sender {
UIAlertController *alertView = [UIAlertController alertControllerWithTitle:@"提示" message:@"我要把按钮的文字传过来" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
//通过 objc_getAssociatedObject获取关联对象
UIButton *sender = objc_getAssociatedObject(alertView, &associatedButtonkey);
NSLog(@"%@",sender.titleLabel.text);
}];
[alertView addAction:cancelAction];
[alertView addAction:okAction];
[self presentViewController:alertView animated:YES completion:nil];
//通过objc_setAssociatedObject这个函数,把alertView和sender关联起来
objc_setAssociatedObject(alertView, &associatedButtonkey, sender,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
最后更新: 2023年03月25日 22:39:55
本文链接: http://aeronxie.github.io/post/dbd71993.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可,转载请注明出处!