1

我差不多完成了應用程序,我正在使用工具來分析它。 ARC在解除分配資源時遇到問題,但我不知道是什麼。我使用分配工具運行儀器,我正在做的是在主視圖中啓動應用程序,然後標記一個堆,我稍微與應用程序交互並返回到原始主視圖並標記另一堆。可可:尋找釋放的缺失參考

我這樣做了好幾次,據我瞭解,不應該有任何顯着的堆增長,因爲我回到了完全相同的地方,我之間做的所有事情都應該被釋放,不提供堆增長。然而,我有了顯着的增長,所以我潛入堆中,我發現幾乎所有東西都有1的保留數,這導致我相信一個對象或視圖等不會因爲我犯的錯誤而被釋放而那個對象就是所有其他東西的引用。

我試圖找出哪些對象沒有被釋放。儀器非常含糊,只提供不明確的指針,不允許我追溯問題。

請讓我知道,如果有,我追查是什麼阻礙了可保持保留計數爲1

由於參考的方式。

回答

0

我的第一個想法是兩件事:
1)你可能有一個保留週期:作爲一個例子,一個對象必須給委託一個強有力的參考。而且代表還有一個強大的參考(而不是一個弱引用)返回到第一個對象。由於他們兩個「持有」另一個,他們都不能被釋放。
2)你可能有一個多線程的應用程序,其中一個線程沒有分配autorelease池(即沒有0​​塊),並且正在創建autorelease對象。即使在返回autorelease對象的簡單getter方法中也可能發生這種情況。如果是這樣,autorelease對象被「放入」一個不存在的自動釋放池(它不會給你一個錯誤消息,因爲你可以發送任何消息到nil),它永遠不會被釋放。
也許這些情況之一適用於您的問題。

+0

我認爲你說的第二個選項可能會發生。雖然我沒有明確地創建任何額外的線程,但有時當一個錯誤彈出爲lldb時,我將看到一個顯示多個併發線程的視圖,但我從未想過太多,我會認爲它們是自動創建的更基礎的級別的東西。不過,如果這可能是這樣,我將如何爲我沒有創建的線程創建自動釋放池? – Elbimio

+0

這很簡單:只需將線程代碼放在autorelease塊中@autoreleasepool {...您的代碼...},請參閱

+0

我不知道我的代碼中的哪個部分創建了新的線程,就像我說的,我沒有明確地調用任何NSThread方法,我只相信我有多個線程,因爲當我得到一個lldb錯誤,顯示了幾個線程。我怎麼知道自動釋放塊會在我的代碼中出現?我從文檔所說的幾個方面嘗試了幾個,但似乎沒有任何改變。這就是爲什麼我想縮小到什麼具體對象沒有被處理。 – Elbimio