Утечка UIImagePickerController в iOS 11

Я настроил свой UIImagePickerController для съемки изображения и записи видео, как самостоятельно. The UIImagePickerController вызывается непосредственно из @IBAction (by a UIButton). Я получаю как UIImage и URL из видео в imagePickerController метод делегата и распечатать их для целей тестирования.

подождав немного (10 секунд), я выбираю "историю графа памяти" Xcode, в которой я вижу, что в обоих случаях тестирования у меня есть утечки памяти, а также циклические ссылки. Я могу Также см. эти утечки памяти в инструментах, если кто-то думает, что это ошибка Xcode.

это происходит, когда я записываю видео:

memory leaks video

и это происходит, когда я делаю снимок:

memory leaks photo

вы можете воспроизвести эти результаты с помощью этого кода на устройстве iOS 11.2 (я не думаю, что тренажеры будут работать):

import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    @IBAction func takePhoto(_ sender: Any) {

        let picker = UIImagePickerController()
        picker.delegate = self
        picker.sourceType = .camera
        picker.allowsEditing = false

        self.present(picker, animated: true, completion: nil)
    }

    @IBAction func recordVideo(_ sender: Any) {

        let picker = UIImagePickerController()
        picker.delegate = self
        picker.sourceType = .camera
        picker.allowsEditing = false
        picker.mediaTypes = ["public.movie"]
        picker.videoQuality = .typeHigh

        self.present(picker, animated: true, completion: nil)
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: Any]) {

        picker.dismiss(animated: true, completion: nil)

        if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
            print(image.size)
        }

        if let video = info[UIImagePickerControllerMediaURL] as? URL {
            print(video.path)
        }
    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    }

}

теперь мой вопрос: Могу ли я исправить их с помощью обходного пути или я что-то не так в моем коде, это ошибка Apple, я должен просто игнорировать ее?

Edit: если кто-то хочет взглянуть на весь проект:https://github.com/ph1ps/UIImagePickerLeak

2 ответов


Я бы сказал, просто игнорируйте "утечки", которые вы видите. Хотя у меня нет кода для резервного копирования, у меня есть некоторый опыт поиска и исправления утечек памяти на работе. По моему опыту, когда вы находите утечки, вы ищете дымящиеся пистолеты. Поэтому для истории графа памяти я бы предположил, что может быть утечка памяти, если бы были сотни или тысячи экземпляров какого-либо типа. Это касается и мобильных приложений. Из того, что я вижу на ваших скриншотах, вы просачиваетесь большинство 1k ,которые (при условии, что даже есть утечка) довольно тривиальны. Таким образом, у вас действительно нет утечки.


Я добавляю код, чтобы доказать, что нет утечки памяти. Вы можете судить об этом либо по моему коду, либо по графу памяти. Я уже сделал запрос.

https://github.com/Andy1984/UIImagePickerLeak