我正在寫一個應用程序(在iOS 5中使用ARC!),在自定義內呈現數百個對象UIViewController
我已經寫道,用戶可以滾動並選擇,每它被呈現爲用戶可能觸摸的縮略圖圖像。iOS - ARC /內存管理問題與ModalViewControllers
這些對象中的每一個都與它關聯了一個特殊的子類,用於處理與該對象相關聯的信息的自定義表示。例如,它可能是一個可以縮放和平移的圖像,或者是一些需要格式化的文本。
現在,我的每個圖像對象都有一個與之相關的大圖像。使用Instruments應用程序來剖析我的代碼並運行活動監視器,當加載自定義UIViewController
子類並顯示圖像時,我發現這些代碼大約需要5-10MB。這對於少數圖像來說很好,但最終我的應用佔用了太多的內存和崩潰。
我在我的子類的-viewDidUnload
方法中寫了很明顯的告訴ARC釋放這個內存所需的所有東西,但是沒有內存被釋放,直到發出警告,這通常在應用即將崩潰時發生。有幾次,我注意到如果我接近閾值但不過去,我以前查看的子類最終會從內存中刷新,儘管-viewDidUnload
方法並沒有明顯被稱爲(相反,-didReceiveMemoryWarning
消息發送到我的自定義UIViewControllers
)。但是,大多數情況下,我的應用程序因爲內存不足而崩潰。
所以我的核心問題是,我是否應該假設一個對象會被ARC儘快拋棄,還是一直等到空間變得緊張?我想要的行爲是自定義視圖控制器及其數據立即刷新,以便內存不會成爲問題。
我不相信有從對象到我的自定義視圖控制器任何強引用,我使用此代碼實例化它們在我的主視圖控制器:
[self presentViewController:[cObj grabModalViewController]
animated:YES completion:nil];
其中cObj
是與對象的自定義類信息。 grabModalViewController
只是簡單地實例化一個正確類型的對象並返回指針,所以大概只要方法完成就應該拋棄對象的局部引用。
結果,我希望的是,當我後來打電話
[self dismissModalViewControllerAnimated:YES];
自定義視圖控制器,只是指出要通過presentedViewController
主視圖控制器應該從內存中刷新,但這並不發生。
難道這是因爲我有我的自定義視圖控制器對象內的強引用?
本質上,我試圖完成的是儘可能避免更多的內存警告,通過更好地管理事情,但也許這不是正確的態度。
我很感激任何建議,我很高興發佈任何和所有有用的代碼。
其實我意識到我說的話很蠢,顯然,如果自定義視圖控制器的內存每次都被回收,那麼不能有強引用指向此對象。然而,我不明白爲什麼內存管理系統是不可靠的,因爲有時我的應用程序崩潰而不是釋放它知道的內存。我想這可能表明了更深層次的東西是錯誤的。 – ddodev 2012-01-09 15:35:07
檢查[cObj grabModalViewController]是否正在返回保留的對象。或者你可能有一個保留週期,你的模態視圖控制器保留了對另一個對象中的實例變量的引用。這些都會阻止模態視圖控制器被釋放。 – timthetoolman 2012-01-09 15:44:22
@timthetoolman感謝您的建議 - 但我相當肯定,這些都不是這種情況。 '[cObj grabModalViewController]'的方法體看起來像這樣:'LightboxViewController * newController = [[LightboxImageViewController alloc] init]; [(LightboxImageViewController *)newController setImageFilename:self.imageFile]; return newController;'新的LightboxImageViewController具有'nonatomic,copy'的imageFile屬性。我認爲有'保留'會導致問題,但是假設這些可以使用'copy'來解決。 – ddodev 2012-01-09 15:46:50