【Objective-C】关联

2016-09-15  本文已影响27人  永恒守护__刘鹏辉

关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分。

  1. 关联特性只有在Mac OS X V10.6以及以后的版本上才是可用的。
  2. 使用关联,我们可以不用修改类的定义而为其对象增加存储空间。这在我们无法访问到类的源码的时候或者是考虑到二进制兼容性的时候是非常有用。
  3. 关联是基于关键字的。因此,我们可以为任何对象增加任意多的关联,每个都使用不同的关键字即可。
  4. 关联是可以保证被关联的对象在关联对象的整个生命周期都是可用的(在垃圾自动回收环境下也不会导致资源不可回收)。
  5. 使用关联时会涉及到3个OC的运行时(runtime)函数:objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects
创建关联

下面展示如何把一个字符串关联到一个数组上。

    static char overviewKey;
    NSArray *array = [[NSArray alloc] initWithObjects:@"One", @"Two", @"Three", nil];
    // 为了演示,这里使用initWithFormat:来确保字符串可以被销毁
    NSString *overview = [[NSString alloc] initWithFormat:@"numbers"];

    objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);
    
    [overview release];
    // ①此时overview仍然可用
    NSLog(@"%@", overview);
    
    [array release];
    // ②此时overview不可用
获取被关联的对象

获取被关联的对象时使用objc_getAssociatedObject函数:

    NSString *associatedObject = objc_getAssociatedObject(array, &overviewKey);
    NSLog(@"associatedObject = %@", associatedObject);
断开关联

断开关联是使用objc_setAssociatedObject函数,传入nil值即可:

    objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);

下面是完整demo:


#import <Foundation/Foundation.h>

#import <objc/runtime.h>

int main(int argc, const char * argv[])
{
    static char overviewKey;
    NSArray *array = [[NSArray alloc] initWithObjects:@"One", @"Two", @"Three", nil];
    // 为了演示,这里使用initWithFormat:来确保字符串可以被销毁
    NSString *overview = [[NSString alloc] initWithFormat:@"numbers"];
    
    objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);
    
    [overview release];
    // 此时overview仍然可用
    NSLog(@"%@", overview);
    
    NSString *associatedObject = objc_getAssociatedObject(array, &overviewKey);
    NSLog(@"associatedObject = %@", associatedObject);
    
    objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);
    NSString *newObject = objc_getAssociatedObject(array, &overviewKey);
    // 输出为空
    NSLog(@"newObject = %@", newObject);
    
    return 0;
}
关联
上一篇下一篇

猜你喜欢

热点阅读