利用objc_setAssociatedObject可以在不改变类结果的情况,为类增加一块内存,存放一些变量。
方法很简单,只要为你增加的变量设置一个key就行了!同时需要设置变量的赋值方式比如说,retain活着assign,或者是否automitic
NSString* myStr = @"string";
const char* key = "key";
NSArray* arr = [[NSArray alloc] initWithObjects:@"hello", @"world", @"!", nil
];
//设置关联变量
objc_setAssociatedObject(arr,key,myStr,OBJC_ASSOCIATION_RETAIN);
//获取关联变量
NSLog(@"my associatedobjct:%@",objc_getAssociatedObject(arr, key));
//取消该关联变量,置空
objc_setAssociatedObject(arr, key, nil, OBJC_ASSOCIATION_RETAIN);
//取消全部关联变量
objc_removeAssociatedObjects(arr);
这个特性用起来很简单,但是作用确不小。试想一下,如果你有很多同一个类的对象,你想给每一个对象设置一个标识符来标示这是第几个对象。
如果是C++里,你可能最容易想到的方法就是在这个类里增加一个变量,作为其标识符。但是这样取改变了原本类的结果,如果你是用的一个库,不能改变其结果,那就更麻烦了,你还得先继承这个类。
OC里的关联另一个用处就是,给category(分类)添加一个变量。我们都知道category是不可以有变量的(extension除外),这个时候利用关联就能巧妙的解决这个问题。