kvo/gcd中关于context指针的赋值

今天我们来说说kvo以及gcd中的context的赋值技巧,我们在iOS开发中经常在两个地方会看到context这个字眼,分别是kvo和gcd的相关函数。

kvo中添加观察者会调用这个函数:

- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;

gcd中把一个dispatchQueue指定到一个上下文中,会调用这个函数:

void dispatch_queue_set_specific(dispatch_queue_t queue, const void *key, void *context, dispatch_function_t destructor);

我们发现这两个函数中都有一个参数 void* context,这个单词翻译过来叫上下文。我的理解,其实就是在内存中打上一个tag,而且这个tag在当前运行环境中必须独一无二,这样就可以通过这个tag快速区分不同的observer(在kvo中)以及dispatchqueue(在gcd中)。那么问题来了,这个tag应该怎么打呢?这里提供一个小技巧:

static void * MyContext = &MyContext;

我们把一个指针的内存地址作为这个指针的值,即一个指针指向它自己,这样就可以确保context的唯一性,是不是很有意思呢,我们平时用的AFNetworking(涉及到kvo的部分)以及XMPPFramework(涉及到dispatchqueue的部分)中都用到了这个小技巧。