2012-01-31 40 views
1

UIImageView當視圖不可見時會自動釋放圖像資源嗎?也許當應用程序獲得內存警告?UIImageView在不在視圖中時是否釋放資源?

如果不是,我正在考慮編寫一個子類(例如SmartReleaseImageView),這樣做可以用於特別有利的情況。我被沿着這些線路思維行爲:

  • SmartReleaseImageView接收setImage消息時,將其與管理自身註冊例如SmartReleaseImageViewManager
  • 當應用程序獲得內存警告時,SmartReleaseImageViewManager遍歷其所有SmartReleaseImageViews並檢查它們中的任何一個是否未添加到超級視圖,或者檢查它們中的任何一個是否具有由於超出界限而被剔除的幀主窗口。
  • SmartReleaseImageView檢測到它已進入視圖並被釋放時,它會再次加載圖像。所以也許,它需要首先有一個像setImageURL而不是setImage的方法。

這種行爲已經建成UIImageView?或者它存在於任何第三方版本中?或者想法有問題嗎?

(我正在寫一個UIImageView重應用程序,這將是很好有一個全球性的包羅萬象的解決方案,這將有助於與內存的情況,而不是增加許多額外的代碼,以我的UIViewControllers。)

編輯:到目前爲止的答案建議UIViewController應該負責。這是真的,我想我的特殊情況是非典型的。在我的情況下,UIViewController可以包含很多自定義視圖(具有自己的層次結構),它不一定知道其結構,以及頻繁出入的視圖。因此,它很難知道何時發佈資源。但是,是的,也許我應該找到一種方法來處理這個問題本身......

+1

聽起來有點像你從錯誤的一面處理問題。 UIViewController通常會在內存變得緊張的時候卸載其視圖 - 對我來說,似乎您應該簡單地依賴這些機制。 – Till 2012-01-31 11:22:35

回答

1

那麼,你實際上已經在UIViewController中實現了這種自動管理。由於UIImageView是UIView的子類,您的視圖控制器應該能夠自動管理它。

內存管理

內存是iOS中的關鍵資源,視圖控制器提供 內置在關鍵 次降低其內存佔用的支持。 UIViewController類通過它的didReceiveMemoryWarning方法提供了一些 低內存條件的自動處理, 釋放不需要的內存。在iOS 3.0之前,這種方法是 唯一的方式來釋放與您的自定義視圖控制器類相關聯的額外內存,但在iOS 3.0和更高版本中,viewDidUnload方法 可能是更適合大多數需求的地方。

當發生低內存警告時,如果UIViewController類知道它可以重新加載或在稍後重新創建它們,則清除其視圖 。如果 發生這種情況,它還會調用viewDidUnload方法,以使代碼 有機會放棄與視圖層次關聯的所有與 相關聯的對象的所有權,包括使用nib文件加載的對象,在您的viewDidLoad方法中創建的對象 以及在運行時緩慢創建對象 並添加到視圖層次結構中。通常,如果您的視圖 控制器包含網點(屬性或包含 IBOutlet關鍵字的原始變量),則應使用viewDidUnload方法 放棄不再需要的那些網點或任何其他視圖相關數據 的所有權。

來源:http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

1

簡短的回答:
UIImageView不釋放資源,從來沒有。
但是當系統需要更多內存時,所有視圖(包括UIImageView)都會被釋放。請注意,您必須在[UIViewController viewDidUnload]中發佈您的觀點。

編輯: 不幸的是,它不起作用,當控制器不顯示。這種情況下,我建議手動清除組件viewDidDissappear(手動調用viewDidUnload並從視圖層次中刪除組件)。

無論如何,如果一個視圖控制器的層次結構中有太多圖像,這將無濟於事。在這種情況下,我會建議創建一組UIImageView並重用它們,就像UITableView重用其單元格一樣。

+0

即使'UIViewController'是當前/活動視圖控制器,是否調用'viewDidUnload'? – 2012-01-31 11:44:12