weak 弱引用的实现方式

422 查看

 对于 runtime 的分析还有很长的路,最近在写 block 系列的同时,也回顾一下之前疏漏的细节知识。这篇文章是关于 weak 的具体实现的学习笔记。

runtime 对 __weak 弱引用处理方式

切入主题,这里笔者使用的 runtime 版本为 objc4-680.tar.gz。 我在入口文件 main.m 中加入如下代码:

单步运行,发现会跳入 NSObject.mm 中的 objc_initWeak() 这个方法。在进行编译过程前,clang 其实对 __weak 做了转换,将声明方式做出了如下调整。

其中的对象指针,就是代码中的 [[NSObject alloc] init] ,而 p 是我们传入的一个弱引用指针。而对于 objc_initWeak() 方法的实现,在 runtime 中的源码如下:

可以看出,这个函数仅仅是一个深层函数的调用入口,而一般的入口函数中,都会做一些简单的判断(例如 objc_msgSend 中的缓存判断),这里判断了其指针指向的类对象是否有效,无效直接释放,不再往深层调用函数。

需要注意的是,当修改弱引用的变量时,这个方法非线程安全。所以切记选择竞争带来的一些问题。

继续阅读 objc_storeWeak() 的实现: