Утечка UIImagePickerController в iOS 11
Я настроил свой UIImagePickerController
для съемки изображения и записи видео, как самостоятельно. The UIImagePickerController
вызывается непосредственно из @IBAction
(by a UIButton
). Я получаю как UIImage
и URL
из видео в imagePickerController
метод делегата и распечатать их для целей тестирования.
подождав немного (10 секунд), я выбираю "историю графа памяти" Xcode, в которой я вижу, что в обоих случаях тестирования у меня есть утечки памяти, а также циклические ссылки. Я могу Также см. эти утечки памяти в инструментах, если кто-то думает, что это ошибка Xcode.
это происходит, когда я записываю видео:
и это происходит, когда я делаю снимок:
вы можете воспроизвести эти результаты с помощью этого кода на устройстве 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 ,которые (при условии, что даже есть утечка) довольно тривиальны. Таким образом, у вас действительно нет утечки.
Я добавляю код, чтобы доказать, что нет утечки памяти. Вы можете судить об этом либо по моему коду, либо по графу памяти. Я уже сделал запрос.