【问题标题】:Why doesn't J2ObjC translate field with @Weak as __weak but __unsafe_unretained?为什么 J2ObjC 不将带有 @Weak 的字段翻译为 __weak 但 __unsafe_unretained?
【发布时间】:2017-12-05 14:50:40
【问题描述】:

众所周知,__unsafe_unretained 不如__weak 安全,那么为什么 J2ObjC 不将 @Weak 的字段转换为 __weak 而是 __unsafe_unretained

【问题讨论】:

    标签: j2objc


    【解决方案1】:

    两个原因:

    1. __weak 仅适用于 ARC 代码,由于显着的性能成本,JRE 仿真库不是使用 ARC 构建的。

    2. 在Objective C 中,可以通过测试是否为nil 来测试__weak 字段是否已被释放。由于在 Java 中无法对普通引用执行此操作,因此依赖于此行为的代码是依赖于平台的(即,在 Android 上的工作方式不同)。

    J2ObjC 支持 java.lang.reflect 包,因此如果您想要一种使用弱引用的跨平台方式,请使用 Wea​​kReference 而不是 @Weak。

    【讨论】:

    • 谢谢!我以为Java的WeakReference会被翻译成__week,但发现它使用了翻译后的java/lang/ref/WeakReference类。我查看了翻译后的WeakReference 的来源,但找不到像__weak 这样的东西,它在ARC 下是如何工作的? (我有循环引用,必须使用weak 打破它)
    • 一个 __unsafe_unretained 注释解决了一个引用循环,这就是 j2objc 将 @Weak 转换为它的原因。 __unsafe_unretained 和 __weak 的唯一区别是后者在实例被释放时也将字段归零。这对翻译后的代码来说不是问题,因为当一个实例被释放时,编译器不应该允许引用该实例的字段。如果您需要在代码中归零字段行为,请使用 java.lang.ref.WeakReference。
    • 感谢您的回答!我已经切换到java.lang.ref.WeakReference,但我有点好奇,翻译后的java.lang.ref.WeakReference在objc中是如何工作的,它在内部使用__weak吗?
    • 不,我基于 Mike Ash 的一篇精彩文章中的 java.lang.ref 支持:mikeash.com/pyblog/…。这是支持类:github.com/google/j2objc/blob/master/jre_emul/Classes/…
    猜你喜欢
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 2016-01-10
    • 2021-05-11
    相关资源
    最近更新 更多