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

时间:2012-10-12 13:48:15

标签: c++ objective-c ios

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

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

2 个答案:

答案 0 :(得分:3)

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

这两件事只能通过Objective-C运行时透明地完成。 Objective-C与C ++在您自己的代码中实现这种魔法的灵活性不同。

答案 1 :(得分:3)

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

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

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