2011-11-07 64 views
5

我試圖符合蘋果關於在我的應用程序中響應低內存警告的指導原則。準則說:「接收到(低內存警告)後,您的應用程序必須釋放盡可能多的內存,釋放不需要的對象或清除內存緩存,以便稍後重新創建。」iOS 5 + ARC - 是否將指針分配給指針釋放內存?

問題是,如何使用ARC釋放內存?

例如,假設我在不在屏幕上的視圖的視圖層次結構中有圖像。在didReceiveMemoryWarning中,我目前通過調用removeFromSuperview將其從視圖中移除,但我仍然有一個指向UIImage本身的指針。我是否也應該嘗試釋放這些內存?怎麼樣?通過將nil分配給指針?

TIA:約翰

+0

請在指針附近提供更多信息。它是一個伊娃,在一個方法,全球,財產本地? – zaph

+0

那麼我正在考慮的是UIImage *實例變量。 – John

+0

好吧,我認爲我解決了我的問題1)使用弱引用的子視圖和2)分配nil指針如果視圖仍然在執行didReceiveMemeoryWarning時(這是我每次在調試器中看到它時) 。主要是,我想我只是意識到,你無法避免一直記憶警告......有時它們是由其他應用程序引起的。你只需要妥善處理它們。修好我的記憶警告處理程序後,我只收到警告一次,而不是每次啓動UIImagePickerController。一個很大的改進。 – John

回答

3
  1. 到時候你-didReceiveMemoryWarning的時候,你的觀點應該已經自動系統釋放和-viewDidUnload應該叫。因此,如果您不持有對視圖子視圖的引用,則不負責釋放視圖。否則,如果您持有對您想釋放的某些資源的引用,則只需通過爲它們分配「nil」爲NSObject s來取消您的引用,併爲其他類型的引用調用相應的發佈函數,例如, CFReleaseCore Foundation對象。

+0

H'mmm ...事情是,我舉一些子視圖的參考,因爲應用程序需要能夠修改或刪除子視圖,作爲應用程序正常運行的一部分。當需要時能夠說[self.mySubView removeFromSuperview]很容易,而不是在每次需要刪除/修改子視圖時遍歷子視圖樹。但我想這意味着即使視圖被釋放,系統也不能釋放子視圖。如果我的鏈接很薄弱,子視圖是否會被正確釋放? – John

+1

當然,你可以使用'__weak',或者你可以在'-viewDidUnload'中簡單地將它設置爲'nil'。 – an0

+0

在iOS6中viewDidUnload不再被自動調用。您需要使用didReceiveMemoryWarning。 – bkbeachlabs

0

使所有IBOutlet屬性具有strong屬性。

將所有IBOutlet屬性全部設置爲nilviewDidUnload

+2

@John特意問到ARC。保留和釋放不再使用。 – Undeadlegion