为什么__weak属性需要运行时支持

Why do __weak properties require runtime support

本文关键字:运行时 支持 属性 weak 为什么      更新时间:2023-10-16

在boost C++中,弱指针被实现为共享(引用计数)指针的观测器。

它们是如何在objective-c中实现的,为什么这需要运行时支持?(即除了支持编译器外,iOS 5或更高版本还需要使用弱引用)

std::weak_ptr实际上包含一个指向共享数据结构的指针,该数据结构保存记账数据和引用的对象。当被引用的对象被销毁时,这个共享数据会被保留在周围,这样weak_ptr就可以看到指示该对象已不在的记账数据,并且当被引用对象被释放时,weak_ptrs本身不必修改。

在Objective-C中,弱引用并不指向保存记账数据的某个中间对象。它们是指向实际被引用对象的普通指针,如果被引用对象不在,则指向nil。当代码的其他部分释放到对象的最后一个非弱指针时,每个__weak指针都必须更新。这需要运行时支持。

换句话说,Obj-C弱指针是普通指针,只是有编译器魔法(使用运行时支持)在它们上工作,而shared_ptrs和weak_ptr只是围绕指针实现自己的运行时支持的包装器(在智能指针的构造函数、赋值运算符、析构函数等中)。

Objective-C弱引用在其指向的对象被释放时被设置为nil。这非常方便(它可以解决引用循环,避免向已释放的对象发送消息),但它确实要求运行时跟踪对对象的所有弱引用,并且当对象最终被释放时,运行时必须清除这些引用。

这两件事都只能由Objective-C运行时透明地完成。Objective-C没有C++那样的灵活性来在自己的代码中实现这种魔术。