1

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

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

4

2 回答 2

3

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

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

于 2012-10-12T13:52:07.713 回答
3

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

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

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

于 2012-10-12T14:52:45.993 回答