2013-01-04 58 views
0

儀器告訴我,當我迅速在我的應用程序設置UIImageview的圖像名稱很多的內存被分配。我有一個UIImageView,它改變了我遊戲中每一幀的圖像名稱。當用殭屍檢查儀器進行配置時,該應用程序似乎不斷以高昂的速度獲得活動字節。有沒有一種方法可以取消分配UIImageView的當前圖像以阻止其執行此操作?我正在使用ARC。的UIImage導致內存泄漏

我的代碼來分配UIImageView的形象如下:

aPlanet.image = [UIImage imageNamed:tempPlanetName];

哪裏aPlanet是UIImageViewtempPlanetName是圖像的名稱。這被稱爲每一幀。

+1

寫你,你是如何分配圖像到您的ImageView –

+1

你應該做在一個'@ autoreleasepool'塊的東西這個可笑的代碼。或者使用像CALayer這樣輕得多的東西,這樣你就不會分配兩個對象,只是爲了每幀顯示一次圖像。 – CodaFi

+1

此外,如果您使用'imageNamed',請注意,iOS會緩存您的圖片。 – borrrden

回答

1

當您使用UIImage imageNamed:它會加載並緩存該圖像文件。這旨在重用圖標和其他圖像資源,這些資源將在應用程序中多次使用。

除了看起來有點不同尋常,每幀更新一個新圖像的圖像視圖,你應該尋找加載圖像的替代方法,你不會需要超過一次 - 甚至如果你這樣做,當你需要更多控制其生命週期。

例如看看UIImage imageWithContentsOfFile:(這裏記載:Apple Developer Library Reference)。它明確指出,這種方法不會對圖像內容進行任何緩存。

我希望這可以幫助你,但每幀我懷疑你的表現會好足夠的這種做法,但是這可能是一個不同的問題需要出現的話題。

+0

使用'UIImage imageWithContentsOfFile:'方法使用的內存遠遠多於'UIImage imageNamed:'方法。雖然我明白你來自哪裏,但在調用方法分配內存但未解除分配的情況下似乎存在問題。這是我最困惑的地方。 – Fitzy

+0

您使用ARC嗎?如果沒有,您將不得不自己釋放圖像實例以再次釋放內存。 –

+0

是的,我正在使用ARC。但由於某些原因,內存不會被釋放。 – Fitzy

4

[UIImage的ImageNamed:]方法將圖像加載到圖像視圖,並增加了該新創建的UIImage對象到自動釋放池。要擺脫這個問題,你應該使用 -

NSString * imgPath = [NSBundle mainbundle] pathForResource:@「imageName」ofType:@「png」]; aPlanet.image = [[UIImage alloc]] initWithContentsOfFile:imgPath];

如果您使用的是弧,那麼您不需要擔心釋放使用initWithContentsOfFile:方法創建的uiimage的這個新分配的對象。