【发布时间】:2018-07-08 10:41:01
【问题描述】:
我已将UIImagePickerController 配置为独立拍摄图像和录制视频。 UIImagePickerController 直接从 @IBAction 调用(由 UIButton 调用)。我在imagePickerController委托方法中从视频中收到UIImage和URL,并将它们打印出来用于测试目的。
稍等片刻(10 秒)后,我选择 Xcode 的“查看内存图历史记录”,在其中我可以看到在两个测试案例中我都有内存泄漏和循环引用。如果有人认为这是 Xcode 错误,我还可以在 Instruments 中看到这些内存泄漏。
当我录制视频时会发生这种情况:
当我拍照时会发生这种情况:
您可以在 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 的错误,我应该忽略它吗?
编辑:如果有人想看看整个项目:https://github.com/ph1ps/UIImagePickerLeak
【问题讨论】:
-
我没有这个问题,但我也没有在视频中使用
UIImagePIckerController。但是让我印象深刻的是这条线:let picker = UIImagePickerController()这是insiderecordVideo(sender:Any)。首先,要创建多少个控制器实例?其次,如果您将事情从Any更改为UIPickerViewController- Xcode 将 IMO 默认设置为非常混乱的方式 - 这有帮助吗?最后,您是否还有其他资源可以将此控制器用于视频? -
@dfd
IBActionss 只被调用一次,它仍然会发生。正如我所说,拍照时也会发生这种情况。我将尝试在函数之外创建选择器。 -
@dfd 在
IBAction之外定义选择器不会改变任何东西:( -
如果拍摄静止图像时发生这种情况,我猜你还没有给我们导致问题的代码。我在三个应用程序中使用
UIImagePickerController没有问题。我的大部分代码都是相似的......除了更全局地实例化选择器,并检查设备上的摄像头。后者不应该有任何区别。如果我的想法不起作用,也许您需要快速/小步退后...创建一个项目(不是框架),添加东西(在您的框架上测试下一个),直到找到原因内存泄漏。祝你好运。 -
@dfd 我发誓这就是它的全部代码。我在 Github 上发布了我的整个项目:github.com/ph1ps/UIImagePickerLeak。也许你可以自己看看并测试一下。
标签: ios swift xcode memory-leaks uiimagepickercontroller