为什么__weak属性需要运行时支持
Why do __weak properties require runtime support
在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++那样的灵活性来在自己的代码中实现这种魔术。
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 我在c++代码中生成了一个运行时#3异常
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- C++项目编译强制使用 /clr 选项,尽管在没有公共语言运行时支持的情况下执行它
- PGI 不支持 OpenMP 4.5 运行时函数
- 为什么__weak属性需要运行时支持
- 正在检查运行时是否支持SSE
- C++公共语言运行时支持 [.Net?]
- 设置公共语言运行时支持后,无法在 Visual Studio 2013 中调试C++
- 使用公共语言运行时支持(/clr)调用mfc dll时,未能运行mfc应用程序
- QT是否支持运行时动态UI生成和HTML呈现
- 有什么方法可以解决 c++ 不支持运行时模板的事实吗?
- 运行时系统如何支持对已编译二进制文件的"GC"?