2013-10-17 62 views
4

我想了解爲什麼我有一個非常基本的UIImage和UIImageView實現內存泄漏。UIImage imageNamed內存泄漏

在這種情況下,我沒有使用ARC(正確禁用)。

我的代碼是非常簡單的:

UIImage *image = [UIImage imageNamed:@"my_image.jpg"]; 
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 
[[self view] addSubview:imageView]; 
[imageView release]; 

我實現在一個UIViewController的viewDidLoad:方法的代碼。

通過調用UIImage的方法imageNamed:,我知道我會得到一個我不擁有/一個autorelease對象的對象。這個對象也將被剛剛實例化的UIImageView對象保留。所以我唯一擁有的對象是UIImageView。

運行此應用程序與內存後泄漏儀器,我有這樣的報道:

enter image description here

我聽說過工作緩存系統,但我不應該有內存泄漏,因爲一些的數據都是緩存。

這裏是一個參考答案與緩存的解釋: https://stackoverflow.com/a/2930567/1154501

預先感謝您!

編輯:也嘗試過與ARC,我得到了同樣的問題。

+0

我會好奇,知道如果使用ARC時發生同樣的泄漏 – Nick

+0

我剛剛嘗試過,我有同樣的問題與ARC –

+2

我想這個是內存泄漏工具的一個問題。代碼分析器有時也有一些問題。 :) – user1567896

回答

0

你嘗試打開「擴展詳細信息」右側面板,尋找其中的內存泄漏的確切行?

你的代碼是好的,我的意見是泄漏是在別的地方。

6

[UIImage imageNamed:]由操作系統管理。取消分配由此方法創建的UIImage可釋放分配的內存。如果您有大量圖片或用戶生成的內容,則應使用[UIImage imageWithContentsOfFile:][UIImage imageWithData:]

如果你與[UIImage的imageNamed:]圖片過多,你的應用程序可以通過,因爲內存使用的iOS喪命。我做了一個示例應用程序向我自己證明這一點,看到更多這裏:iOS UIImage storage formats, memory usage and encoding/decoding

+0

謝謝您的回答。爲什麼這個操作是由操作系統管理的? –

+0

蘋果怎麼說這只是。他們指的是系統緩存這裏:https://developer.apple.com/library/ios/documentation/uikit/reference/UIImage_Class/Reference/Reference.html#//apple_ref/occ/clm/UIImage/imageNamed: – jjxtra