2013-10-03 68 views
0

我正在使用xcode 4中的分析器來確定是否有任何內存泄漏。我之前沒有泄漏過,但是使用xcode 5我有這個漏洞。圖像中的內存泄漏

我試圖設置圖像爲我的`的UIViewController和剖析標記這條線的標籤項:

image = [[UIImage alloc] initWithContentsOfFile:imgPath]; <<=== Leak : 9.1% 

這是我的代碼的一部分,我不明白爲什麼。解決此問題的最佳方法是什麼?編輯: 在iOS6上沒有泄漏。

爲什麼它在iOS7上泄漏?

回答

0

您應該切換到自動釋放方法imageNamed:方法。這具有系統級緩存圖像的額外好處。

NSString *imgPath; 
UIImage *image; 

IBNewsViewController *newsView = [[IBNewsViewController alloc] initWithURL:[tvLocal urlFlux] title:@"News" isEmission:NO]; 
[newsView setTitle:@"News"]; 

image = [UIImage imageNamed: @"news"]; 
newsView.tabBarItem.image = image; 

UINavigationController* navNew = [[UINavigationController alloc] initWithRootViewController:newsView]; 
[newsView release]; 
newsView = nil; 

要對自己的生活更輕鬆我想切換項目中使用ARC所以你必須少操心WRT內存管理。

+0

感謝您的幫助!它的工作!:) – JND

+0

我使用弧,我得到了一些[imageview setImage泄漏:[UIImage imageNamed:@「img-568h @ 2x 「]];現在只在模擬器中 – dave

0

替換該行

image = [[UIImage alloc] initWithContentsOfFile:imgPath]; 

隨着

image = [UIImage imageWithContentsOfFile:imgPath]; 

,並檢查一次。

+0

不工作:(泄漏... – JND

0

首先,switch to ARC。在iOS上你可以做任何事情都不會改變你的代碼,並通過一次移動就可以消除整個內存類型的問題。

除此之外,上面的代碼本身並沒有泄漏。這表明實際的錯誤在別處。有幾種方法,這可能會發生:

  • 你泄露IBNewsViewController其他
  • IBNewsViewController混亂的地方,其tabBarItem錯誤和泄漏是
  • 你泄露UINavigationController別的地方
  • 你」在其他地方重新保留tabBarItem.image並且無法釋放它

這些是最有可能的我會尋找。如果您直接訪問ivars,那往往會導致這類錯誤。除了initdealloc之外,您應該使用訪問器。 (這在ARC中是真實的,但是在沒有ARC的情況下是絕對關鍵的。)

泄漏檢測並不完美。有各種「遺棄」的記憶,可能不會是泄漏。我經常建議使用Heapshot(現在稱爲「Generation」)分析來查看可能會放棄哪些其他對象;這可能會讓你更好地瞭解這種泄漏。

爲什麼iOS 6和iOS 7的差異?我懷疑你在iOS 6上有同樣的問題,但它看起來不像是「泄漏」,可能是因爲緩存了iOS 7中刪除的圖像。緩存指針可能會使它看起來像不是Instruments的泄漏。

說到這,請確保運行靜態分析器。它可以幫助你發現問題。

當然,切換到ARC。