3

比方說,我想創建一個臨時變量,例如:我應該使用__unsafe_unretained作爲臨時變量嗎?

  1. 指向另一個長壽的變量:

    __unsafe_unretained UIView *tableHeaderView = self.tableView.tableHeaderView; 
    
  2. 指向我剛剛創建的對象。

    __unsafe_unretained UIView *tableHeaderView = [[UIView alloc] init]; 
    

這些臨時變量不需要保留,因爲它們指向的對象都保持積極的保留計數,只要臨時變量都在範圍之內。那麼,我應該宣佈他們爲__unsafe_unretained

+1

Joshua和zoul說了什麼。額外保留/釋放的影響對於您獲得的問題預防來說並不重要。 – Wevah

回答

1

否。如果ARC保留它,當變量超出範圍時它將放開。

5

爲什麼系統保留你的臨時變量很重要?事實上,你想保留它。

考慮:

__unsafe_unretained UIView *tableHeaderView = self.tableView.tableHeaderView 
self.tableView.tableHeaderView = nil; 
NSLog(@"%@", tableHeaderView); //<-I WILL CRASH 
+0

僅出於性能原因。看起來編譯器應該足夠聰明,如果不需要保留臨時變量。 – ma11hew28

+2

雖然它不能合理地知道。如果不是直接在那裏設置它,我調用了一些其他方法觸發了一系列導致tableHeaderView被釋放的事件。此外,你正在優化。如果物體的保留是您對性能的首要關注,那麼您已經完成了大量的其他工作。對象所有權不會成爲你的瓶頸。 –

2

馬特,

ARC的全部意義就是讓你忽略了這類問題。事實上,編譯器甚至可能不保留這些實例。

讓ARC擔心這些問題。在編譯器或靜態分析器投訴之前不要試圖提供幫助。 (順便說一句,你讓分析器在每次編譯時都運行,對嗎?它會在你創建它們時發現問題。)

你應該只關心循環中多餘的對象創建以及管理大對象的創建。前者通過審慎使用@autorelease來處理。您仍然像管理ARC一樣管理大型項目。

Andrew

相關問題