我已经将我的UIImagePickerController配置为独立拍摄图像和录制视频。UIImagePickerController直接从@IBAction调用(由UIButton调用)。我在UIImage委托方法中接收来自视频的imagePickerController和URL,并将它们打印出来进行测试。
在等待了一会儿(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)
}
}现在我的问题是:我能不能解决这些问题,或者我在代码中做错了什么,这是苹果的错误吗,我应该忽略它吗?
编辑:如果有人想看一下整个项目:https://github.com/ph1ps/UIImagePickerLeak
发布于 2018-02-07 05:33:24
我想说的是,忽略你所看到的“泄露”。虽然,我没有任何代码来支持这一点,但我确实有一些在工作中查找和修复内存泄漏的经验。根据我的经验,当你发现泄密时,你会找出冒烟的枪。因此,对于内存图历史,我怀疑如果有数百或数千个某种类型的实例泄漏,可能会有内存泄漏。这也适用于移动应用程序。从您的屏幕截图中我可以看到,您最多泄漏1k,这(假设甚至存在泄漏)是非常微不足道的。因此,你看起来真的没有泄漏。
发布于 2018-02-07 04:39:45
我添加了一些代码来证明没有内存泄漏。您可以根据我的代码或内存图来判断它。我已经提出了拉的请求。
发布于 2019-02-27 21:38:00
关于是否有泄漏,我看到了各种相互矛盾的信息。
首先..。是的,正是它的不一致性让人们感到沮丧。
在使用UIImagePickerController时,我完全看到了保留。如果有问题的话,这是有问题的。我有一个用户配置文件编辑器,它有两个位置可以拍摄/选择一个图像(一个用于人,一个用于他的车辆)。当我对两者使用完全相同的代码时,其中一个版本很好,我的profileEditViewController代码也很好。当我使用另一个,甚至取消选择一个图像,它不会释放,我的控制器永远不会。完全一样的密码。在两个地方都是100%。
我认为这可以归结为授权保留,但我尝试了不设置委托(因此,它基本上是无用的),同样的结果是显而易见的。只要启动第二个UIImagePickerController,就会产生一个保留锁,甚至为第二个变量声明一个完整的其他变量。只要不启动第二个选择器,我就可以让我的控制器执行任务,但是内存不会丢失。
即使与我的控制器断开连接,它仍在保持。当这种情况出现在苹果公司最严格的例子中,在产品代码中写成字母时,就有点傻了:(
https://stackoverflow.com/questions/48506285
复制相似问题