8

我在iPhone應用程序中使用UIImagePickerController時發現內存泄漏。我使用的標準代碼從蘋果的文件來實現控制:UIImagePickerController內存泄漏

UIImagePickerController* imagePickerController = [[UIImagePickerController alloc] init]; 
    imagePickerController.delegate = self; 
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { 

     switch (buttonIndex) { 
      case 0: 
       imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera; 
       [self presentModalViewController:imagePickerController animated:YES]; 
       break; 
      case 1: 
       imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
       [self presentModalViewController:imagePickerController animated:YES]; 
       break; 
      default: 
       break; 
     } 
    } 

而對於取消:

-(void) imagePickerControllerDidCancel:(UIImagePickerController *)picker 
{ 
    [[picker parentViewController] dismissModalViewControllerAnimated: YES]; 
    [picker release]; 
} 

的didFinishPickingMediaWithInfo回調是一樣斯塔納德,雖然我不甚至要挑不出什麼造成泄漏。

下面是我在文書中看到的,當我所做的只是打開UIImagePickerController,挑選照片庫並重覆按取消。正如你可以看到內存不斷增長,並最終導致我的iPhone應用程序大幅減速。

enter image description here

正如你可以看到我打開影像選擇器24次,每一次都malloc分配128KB這是從來沒有釋放。基本上我的總6mb中有3mb從未發佈。

無論我做什麼,該內存都會泄漏。即使離開當前的控制器,仍然是一樣的。我也將picker控件作爲一個singleton實現,結果相同。

這是我所看到的,當我深入到這兩條線:

enter image description here

任何幫助這裏將不勝感激!再次,我甚至不必選擇一個圖像。我所做的只是呈現控制器,然後按取消。

更新1

我下載並運行使用UIIMagePickerController的蘋果的例子,我看到相同的泄漏發生有運行工具(無論是在模擬器和手機)時。

http://developer.apple.com/library/ios/#samplecode/PhotoPicker/Introduction/Intro.html%23//apple_ref/doc/uid/DTS40010196

所有你需要做的就是打照片庫鈕,撞取消一遍又一遍,你會看到內存保持增長。

任何想法?

更新2

查看照片庫時,我只看到了這個問題。我可以選擇拍照,並且一遍又一遍地打開和關閉,而不會泄漏。

+1

如果你已經NSZombieEnabled(我認爲這也是該計劃設置的複選框),這會導致明顯的泄漏... –

+0

什麼OS版本/設備?如果是iOS 5,請將其報告給Apple或在適當的開發論壇中討論。 –

+0

使用iOS 4.3。我運行的手機是iPhone 4. – Watson

回答

0

嘗試在發佈之前將UIImagePickerController.delegate設置爲nil

-(void) imagePickerControllerDidCancel:(UIImagePickerController *)picker 
{ 
    [[picker parentViewController] dismissModalViewControllerAnimated: YES]; 
    picker.delegate = nil; 
    [picker release]; 
} 
+0

沒有工作。將代表設置爲零後仍然有泄漏。 – Watson

1

由於2.x中的泄漏(這讓我覺得老了......),我們的一些應用程序重複使用相同的UIImagePickerController。我的印象是泄漏是固定的,但我可能是錯的。

這是一個稍微可怕的解決方法,但有時候這是你能做的最好的。

+0

謝謝。我曾嘗試重複使用相同的UIImagePickerController,並且遇到同樣的問題。 – Watson

+0

我剛剛實施了這個解決方案,它像一個魅力。這是一個包含解決方案示例的github項目的鏈接(https://github.com/mikeytdan/CameraLeak/pull/1) – eckyzero

+0

@eckyzero:該錯誤*仍然*周圍?哇。 –

0

對於我來說,Instruments中的「Mark Heap」按鈕一直是追蹤這類問題的最佳方式。

這是一個OK文章對如何使用它:http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/

告訴你,肯定的,哪些對象存活時間比您預期......,最終什麼問題的根源在於。

您還可以看到每個存活的單個物體的完整保留/釋放軌跡 - 讓您可以查明問題所在。

編輯:我也使用UIImagePickerControllers,並且我可以保證它不會泄漏(對我而言)您提示的方式 - 因此,無論發生什麼事情,它幾乎肯定是可以修復的。

+0

謝謝史蒂夫!我不知道「馬克堆」。當我運行Apple的照片選擇器示例代碼時(我在查看代碼中查看堆大小時看到完全相同的泄漏),這就是我所看到的。 http://i56.tinypic.com/2yzbwd3.png在這裏看到http://developer.apple.com/library/ios/#samplecode/PhotoPicker/Introduction/Intro.html%23//apple_ref/doc/uid/ DTS40010196-Intro-DontLinkElementID_2 – Watson

+0

@Watson;並且如果您單擊128k和36k對象右側的那個小箭頭,您會看到釋放/保留痕跡? – Steve

+0

史蒂夫,對於128K它顯示1行的malloc 128.00 KB的malloc 1 RefCt的UIKit負責圖書館 - [UINavigationController的_startTransition:fromViewController:toViewController:] 和36K,除了36K同樣的事情。 – Watson

0

我用UIImagePickerController和40後拍攝圖像我的應用程序收到DidMemoryWarning消息並停止,隱藏我的所有意見。

在我的應用程序創建的

UIImagePickerController(new UIImagePickerController()) 

40個對象要正常工作,我創建共享給所有的應用程序,並與這一切都正常工作的唯一實例。

我也控制了內存丟失,但只有一次。我的應用程序可以捕捉從相機正確的圖像:

private static UIImagePickerController picker = new UIImagePickerController();