3

我正在寫一個應用程序(在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主視圖控制器應該從內存中刷新,但這並不發生。

難道這是因爲我有我的自定義視圖控制器對象內的強引用?

本質上,我試圖完成的是儘可能避免更多的內存警告,通過更好地管理事情,但也許這不是正確的態度。

我很感激任何建議,我很高興發佈任何和所有有用的代碼。

+0

其實我意識到我說的話很蠢,顯然,如果自定義視圖控制器的內存每次都被回收,那麼不能有強引用指向此對象。然而,我不明白爲什麼內存管理系統是不可靠的,因爲有時我的應用程序崩潰而不是釋放它知道的內存。我想這可能表明了更深層次的東西是錯誤的。 – ddodev 2012-01-09 15:35:07

+0

檢查[cObj grabModalViewController]是否正在返回保留的對象。或者你可能有一個保留週期,你的模態視圖控制器保留了對另一個對象中的實例變量的引用。這些都會阻止模態視圖控制器被釋放。 – timthetoolman 2012-01-09 15:44:22

+0

@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

回答

5

所以我的核心問題是,我應該承擔的對象將通過ARC儘快予以處置可能 呢,還是一直等到 空間變得緊張?

ARC是一種編譯技術。它對你的運行時內存堆一無所知。因此,它迫不及待地放下物品,直到空間變得緊張。你的問題的一個具體答案是ARC會在你不再需要它時立即發佈。

+0

或換句話說:* ARC不是垃圾收集*。 – 2012-12-18 21:23:28