【发布时间】:2017-12-05 14:50:40
【问题描述】:
众所周知,__unsafe_unretained 不如__weak 安全,那么为什么 J2ObjC 不将 @Weak 的字段转换为 __weak 而是 __unsafe_unretained?
【问题讨论】:
标签: j2objc
众所周知,__unsafe_unretained 不如__weak 安全,那么为什么 J2ObjC 不将 @Weak 的字段转换为 __weak 而是 __unsafe_unretained?
【问题讨论】:
标签: j2objc
两个原因:
__weak 仅适用于 ARC 代码,由于显着的性能成本,JRE 仿真库不是使用 ARC 构建的。
在Objective C 中,可以通过测试是否为nil 来测试__weak 字段是否已被释放。由于在 Java 中无法对普通引用执行此操作,因此依赖于此行为的代码是依赖于平台的(即,在 Android 上的工作方式不同)。
J2ObjC 支持 java.lang.reflect 包,因此如果您想要一种使用弱引用的跨平台方式,请使用 WeakReference 而不是 @Weak。
【讨论】:
WeakReference会被翻译成__week,但发现它使用了翻译后的java/lang/ref/WeakReference类。我查看了翻译后的WeakReference 的来源,但找不到像__weak 这样的东西,它在ARC 下是如何工作的? (我有循环引用,必须使用weak 打破它)
java.lang.ref.WeakReference,但我有点好奇,翻译后的java.lang.ref.WeakReference在objc中是如何工作的,它在内部使用__weak吗?