2014-03-26 124 views
4

我開發了我的第一個應用程序,但仍在學習。剛剛更新了Xcode 5昨天和我的iPhone 5運行iOS 7.1。我現在正在理解Instruments工具來分析我的應用程序。我正在使用樂器中的泄漏配置文件,並遇到了我無法弄清楚的保留週期和泄漏情況。感謝我能夠理解的任何幫助a)如何查明錯誤和b)我做錯了什麼以及將來如何避免它。使用儀器跟蹤內存泄漏Xcode5和iOS7

在我的應用程序中,我使用相機拍照。當相機開始工作時,我在屏幕上點擊以進行對焦,這是當我注意到樂器中出現泄漏時。看起來有一個保留週期不在我的代碼中(如果我理解正確的話),並且我的代碼中有一個根本泄漏,我不明白。

我正在使用ARC,所以我不應該在我的代碼中指出我的代碼部分(下面的第2部分,代碼)中發佈「選擇器」。

CALayer Retain Cycle

  1. 我可以做的保留週期是什麼。這不是我的代碼,但我仍然是它的原因嗎?它是否源自「根源泄漏?」如果我不負責,我該怎麼辦?

Root Leak

  • 我在這個堆棧跟蹤唯一的代碼並不能幫助我明白的地方泄漏的來源。線是儀器指向我在我的代碼是[選擇器dismissViewControllerAnimated:YES完成:無];在我的imagePickerController:didFinishPickingMediaWithInfo:方法。我正在粘貼下面的代碼。
  • - (void)imagePickerController:(UIImagePickerController *)picker 
        didFinishPickingMediaWithInfo:(NSDictionary *)info 
    { 
        UIImage *pickerImage = [info objectForKey: 
              UIImagePickerControllerOriginalImage]; 
    
        _imageView.image = pickerImage; 
    
        [picker dismissViewControllerAnimated:YES completion:nil]; // <--- mem-leak 
    } 
    

    編輯 - 在創建我的UIImagePickerController代碼。

    - (IBAction)snapPicture:(id)sender 
    { 
        UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; 
    
        // If the camera button was tapped AND we have a camera, use it... 
        if ((sender == _cameraButton) && [UIImagePickerController 
         isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) 
        { 
         [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera]; 
        } else { 
         [imagePicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary]; 
        } 
    
        imagePicker.delegate = self; 
    
        // bring up the image picker view 
        [self presentViewController:imagePicker animated:YES completion:nil]; 
    } 
    
    +0

    你可以發佈你創建'UIImagePickerController'的代碼嗎? – Austin

    +1

    那麼什麼是CAMBlurredSnapshotView?我的意思是,這顯然是問題的原因。這是你從別的地方拿走的代碼嗎? – matt

    +0

    @奧斯汀 - 無法弄清楚如何在這裏創建代碼塊。你可以在這裏看到我在哪裏創建UIImagePickerController的方法:http://pastebin.com/7s37iaFA – knarf74

    回答

    7

    這裏是我的理論:你遇到了什麼,卻顯然是蘋果自己的代碼中的錯誤(或缺陷),以及所有你能做的就是笑發狂忘掉它。

    爲了測試我的理論,我運行了我自己的代碼,完全單獨寫在不同的時間。它的功能與您的代碼幾乎完全相同:它可讓用戶拍攝照片,並將圖像放入界面。這裏是我的代碼:

    https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch17p702takeAPicture/ch30p962takeAPicture/ViewController.m

    我跑我的代碼在儀器與儀器泄漏,你猜怎麼着?我看到了你所做的同樣的問題。

    enter image description here

    當然,我便開始對堆棧溢出搜索,而這一切原來是舊地。例如:

    UIImagePickerController memory leak on iOS5

    即使是蘋果自己的示例代碼,稱爲PhotoPicker(或使用的UIImagePickerController選擇照片和拍照)具有相同的泄漏。

    +0

    謝謝大家。應該在我的搜索中包含UIImagePickerController。我包括CALayer,並發現其他人沒有回答這個問題。感謝您的時間和精力。我剛剛修復了一個不同的內存泄漏問題,我不得不釋放CFTypeRef,直到今天才意識到這一點。所以我在想也許有一些我不明白我錯過的圖像選擇器。再次感謝! – knarf74

    +1

    以下是我的書中有關CFTypeRef內存管理的討論:http://www.apeth.com/iOSBook/ch12.html#_memory_management_of_cftyperefs – matt

    +0

    @matt:那麼有沒有解決方案?任何人向蘋果報告錯誤?我運行的「SquareCam」演示應用程序它也崩潰了一段時間後。我的應用程序也崩潰後幾分鐘... –