为什么ARC转换将“弱”装饰器添加到“只读”属性?

问题描述:

我只是更新一个非常古老的项目到ARC(2017年 - 我知道)。为什么ARC转换将“弱”装饰器添加到“只读”属性?

我注意到,对于readonly属性声明,它增加了一个weak修饰符。例如:

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

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

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

当应用于readonly属性时,有几个SO关于weakstrongcopy的含义的问题和解答。一个例子是this这似乎与this直接抵触 - 我真的不明白它是如何合理的,因为他们似乎只适用于设置属性,并且readonly有一个明确的getter方法。

引进ARC之前,默认内存属性为assign,因此

@property (nonatomic, readonly) NSString *defaultName; 

是一样的

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

这应该解释一下为什么你ARC迁移使用weak

ARC引入时更改 - 对象类型strong/retain成为默认值。

该属性只影响setter,因此对于readonly属性,该属性可以具有任何值。

+0

感谢您回答现在大多数读者对最不感兴趣的东西!它是有道理的,它选择“弱”,因为没有其他说明符给出,这是默认的,谢谢。所以,在'readonly'情况下,ARC转换器可以将其保留在内存属性中,但不会。指定它是多余的,但没有问题? – Benjohn

+1

@Benjohn它不能忽略这个属性,因为这可能是错误的('assign'是旧的默认值,新的默认值是'strong')。该属性可能被重写为'readwrite',然后内存属性必须相同... – Sulthan

+0

这很有道理。好答案 – adev