NSProxy

吾尝以为NSObject是Apple的所有Objective-C引用类型的老祖宗,直到后来知道了NSProxy的存在…

NSProxyclass NSObject平级,彼此没有继承关系;唯一的相同点是它们都遵循protocol NSObject。尚未在开发中使用过NSProxy,最近琢磨需求开发的方案时注意到了这个类的存在,有不少疑问,譬如NSproxy存在的意义是什么?如何使用它呢?本文将疑惑记录下来,并尝试自我解惑。

Weak Associated Object

NSObject对象绑定associated object时可以指定如下依赖关系:

  • OBJC_ASSOCIATION_ASSIGN: 弱引用
  • OBJC_ASSOCIATION_RETAIN_NONATOMIC: 强引用,非原子操作
  • OBJC_ASSOCIATION_COPY_NONATOMIC: 先copy,然后强引用
  • OBJC_ASSOCIATION_RETAIN: 强引用,原子操作
  • OBJC_ASSOCIATION_COPY: 先copy,然后强引用,原子操作

却没有提供OBJC_ASSOCIATION_WEAK这样的选项,我在开发过程中遇到这个问题,本文记录我的浅薄思考和解决方案。

dispatch_semaphore

除了dispatch_sync、dispatch_queue系列接口,日常开发中,GCD中另一被使用得最多的系列接口恐怕是dispatch_semaphore了。

信号量(semaphore)是PV操作的载体,基本操作有四种:初始化、等信号、给信号、清理。对应的dispatch_semaphore系列接口也就寥寥3个:

dispatch_semaphore_t dispatch_semaphore_create(long value);
long dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);
long dispatch_semaphore_signal(dispatch_semaphore_t dsema);

本文旨在对这几个接口进行简单介绍,描述我所遇到的坑,最后,罗列常见应用。

NSObject的消息转发机制

15年,刚开始接触runtime的时候,记录过消息转发相关的博客,最近做需求涉及到了一些消息转发相关的内容,得闲将旧博客翻出来重新梳理了一下。

为什么标题含有「NSObject」关键字眼呢?因为本文叙述的消息转发机制是针对NSObject对象;在我看来,Objective-C世界里的另一个根类NSProxy的消息转发逻辑和NSObject完全不同。

P.S: 如果没有特别说明,本文的NSObject指的是class NSObject,而不是protocol NSObject

如下这张取自《Effective Objective-C 2.0》的图片描述了NSObject对象的消息转发全流程:

QQ20150427-1.png

简单来说,当一个OC对象(receiver)接收到Unknown selector时,会进入如图流程,用户可以在这三个步骤中override receiver的相关方法,进而避免doesNotRecognizeSelector:异常。