2017-08-04 101 views
1

我只是更新一個非常古老的項目到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方法。

回答

2

引進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

相關問題