簡體   English   中英

ARC保留假人的循環

[英]ARC Retain cycle for dummies

我的應用程序面臨內存問題,

我有一個基於導航的應用程序,如果我推,彈出並推動我的所有控制器,應用程序將因內存過載而關閉。

我認為這就是我們所說的保留周期:

我有一個自定義導航控制器: MyNavController ,這個Controller是我的根控制器,並推送主UIViewControllerMyMainController ,當應用程序啟動應用程序使用大約130 MB的內存,當我推一個新的控制器:內存上升到160然后我彈出這個控制器:內存仍然是160(確切地說是159)然后我推另一個視圖控制器:內存高達190 MB ......內存永遠不會下降。

  • 你能證實我這是一個保留周期嗎?

  • 如果我沒有錯,當我彈出一個視圖控制器時,內存應該減少視圖控制器的內存大小?

  • 我總是在我的屬性(按鈕,視圖,customView,customObject ...)中使用strong,但是當我在第二級控制器中設置斷點到dealloc方法時,我知道它被調用了,所以應該釋放控制器嗎?

  • 我嘗試了一些東西:我做了一個空的UIViewController並將我的xib中的視圖設置為我的一個非釋放控制器,因此它可能比清除更重,所以這個控制器沒有代碼行,只需一個.h和.m沒有任何自定義代碼,當我按下這個控制器時內存上升,當我彈出它時,內存不會下降! 我真的不明白我需要尋找什么,我是否必須在我的MainViewController上進行llok? 或者在控制器中我推動堆棧?

我只需加載我的控制器:

GeoControllerViewController *aGeoController = [[GeoControllerViewController alloc] initWithNibName:@"GeoControllerViewController" bundle:nil];
aGeoController.dictionnaryModele = _dicCours;
[self.navigationController pushViewController:aGeoController animated:YES];

提前致謝。

你問:

你能證實我這是一個保留周期嗎?

不,可能是泄漏。 可以緩存。 可能是一個保留周期。 我們無法判斷您與我們分享的內容。

如果我沒有錯,當我彈出一個視圖控制器時,內存應該減少視圖控制器的內存大小?

通常它會在您彈出時減少,但如果使用緩存進行任何操作,或者填充共享模型或者您擁有的內容,它可能不會在初始推送之前完全返回到內存級別。 話雖如此,如果有游戲中有緩存,如果你多次推送和彈出,你在分配中看到的總“活字節”應該在你推送和彈出幾次后返回到一致的水平。

我總是在我的屬性(按鈕,視圖,customView,customObject ...)中使用strong,但是當我在第二級控制器中設置斷點到dealloc方法時,我知道它被調用了,所以應該釋放控制器嗎?

如果調用該控制器的dealloc ,則會告訴您這不涉及任何保留周期,並且系統將恢復與控制器關聯的內存。 從理論上講,它的任何強大屬性也應該被釋放。

IBOutlet ,通常你的IBOutlet引用(即由NIB /故事板創建的那些東西)在ARC項目中應該是weak的。


一些具體的建議:

  1. 通過靜態分析器運行代碼(Xcode“產品”菜單上的“分析”)並確保在那里沒有警告。 如果您有,請先修復它們。

  2. 通過Instruments中的Leaks工具運行代碼,看看它是否報告任何內容。 如果是,那將告訴您如何繼續。

  3. 如果仍然找不到問題,請使用“儀器”中的“分配”工具運行該工具,在轉到下一個場景之前標記快照/生成,轉到下一個場景,返回並標記另一個快照/生成。 然后,您可以分析在這兩個時刻之間分配和未分配的內容,這將告訴您接下來要查找的內容。

    有關如何執行此操作的一些演示,請參閱WWDC 2012視頻iOS應用程序性能:內存

坦率地說,130MB似乎對於一般的開始來說太過分了。

  • 我不會那么肯定。 問題是:除了導航控制器之外,你是否對控制器有任何引用? 它也可能是泄漏。 為什么這些控制器消耗這么多內存?

  • 是的,內存消耗應該更低。

  • 我不知道我的問題是否正確。 通常強大的屬性是可以的,但你必須要小心,例如當兩個物體相互堅持時。 在ARC中也調用dealloc ,因此您可以在釋放對象時注銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM