为什么 ARC 转换要为 "readonly" 属性添加 "weak" 装饰器?

Why does ARC conversion add "weak" decorator to "readonly" properties?

我只是将一个非常老的项目更新到 ARC(2017 – 我知道)。

我注意到对于 readonly 属性 声明,它添加了一个 weak 装饰器。例如:

// Before conversion to ARC:
@property (nonatomic, readonly) NSString *defaultName;

// After conversion to ARC:
@property (weak, nonatomic, readonly) NSString *defaultName;

有人可以解释为什么要这样做吗?

关于 weakstrongcopy 应用于 readonly 属性 的含义,有一些 SO 问题和答案。一个例子是 this which seems to be directly contradicted by this – 我真的不明白它有什么意义,因为它们似乎只适用于设置 属性 和 readonly 有一个明确的 getter 方法。

在引入ARC之前,默认的内存属性是assign,因此

@property (nonatomic, readonly) NSString *defaultName;

相同
@property (nonatomic, assign, readonly) NSString *defaultName;

这应该可以解释为什么 ARC 迁移使用 weak

这在引入 ARC 时发生了变化 - 对于对象类型 strong/retain 成为默认值。

这个属性无论如何只影响设置器,因此对于 readonly 属性,该属性可以有任何值。