[英]ARC Retain cycle for dummies
我的應用程序面臨內存問題,
我有一個基於導航的應用程序,如果我推,彈出並推動我的所有控制器,應用程序將因內存過載而關閉。
我認為這就是我們所說的保留周期:
我有一個自定義導航控制器: MyNavController
,這個Controller是我的根控制器,並推送主UIViewController
: MyMainController
,當應用程序啟動應用程序使用大約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
的。
一些具體的建議:
通過靜態分析器運行代碼(Xcode“產品”菜單上的“分析”)並確保在那里沒有警告。 如果您有,請先修復它們。
通過Instruments中的Leaks工具運行代碼,看看它是否報告任何內容。 如果是,那將告訴您如何繼續。
如果仍然找不到問題,請使用“儀器”中的“分配”工具運行該工具,在轉到下一個場景之前標記快照/生成,轉到下一個場景,返回並標記另一個快照/生成。 然后,您可以分析在這兩個時刻之間分配和未分配的內容,這將告訴您接下來要查找的內容。
有關如何執行此操作的一些演示,請參閱WWDC 2012視頻iOS應用程序性能:內存 。
坦率地說,130MB似乎對於一般的開始來說太過分了。
我不會那么肯定。 問題是:除了導航控制器之外,你是否對控制器有任何引用? 它也可能是泄漏。 為什么這些控制器消耗這么多內存?
是的,內存消耗應該更低。
我不知道我的問題是否正確。 通常強大的屬性是可以的,但你必須要小心,例如當兩個物體相互堅持時。 在ARC中也調用dealloc
,因此您可以在釋放對象時注銷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.