首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIImagePickerController在iOS 11上的泄漏

UIImagePickerController在iOS 11上的泄漏
EN

Stack Overflow用户
提问于 2018-01-29 16:55:15
回答 3查看 1.2K关注 0票数 9

我已经将我的UIImagePickerController配置为独立拍摄图像和录制视频。UIImagePickerController直接从@IBAction调用(由UIButton调用)。我在UIImage委托方法中接收来自视频的imagePickerControllerURL,并将它们打印出来进行测试。

在等待了一会儿(10秒)之后,我选择了Xcode的“查看内存图历史记录”,在这两个测试案例中,我看到了内存泄漏和循环引用。如果有人认为是Xcode错误,那么我也可以在仪器中看到这些内存泄漏。

当我录制一段视频时会发生这样的情况:

当我拍一张照片时,就会发生这种情况:

您可以在iOS 11.2设备上使用以下代码来再现此结果(我认为模拟器不起作用):

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-07 05:33:24

我想说的是,忽略你所看到的“泄露”。虽然,我没有任何代码来支持这一点,但我确实有一些在工作中查找和修复内存泄漏的经验。根据我的经验,当你发现泄密时,你会找出冒烟的枪。因此,对于内存图历史,我怀疑如果有数百或数千个某种类型的实例泄漏,可能会有内存泄漏。这也适用于移动应用程序。从您的屏幕截图中我可以看到,您最多泄漏1k,这(假设甚至存在泄漏)是非常微不足道的。因此,你看起来真的没有泄漏。

票数 9
EN

Stack Overflow用户

发布于 2018-02-07 04:39:45

我添加了一些代码来证明没有内存泄漏。您可以根据我的代码或内存图来判断它。我已经提出了拉的请求。

https://github.com/Andy1984/UIImagePickerLeak

票数 1
EN

Stack Overflow用户

发布于 2019-02-27 21:38:00

关于是否有泄漏,我看到了各种相互矛盾的信息。

首先..。是的,正是它的不一致性让人们感到沮丧。

在使用UIImagePickerController时,我完全看到了保留。如果有问题的话,这是有问题的。我有一个用户配置文件编辑器,它有两个位置可以拍摄/选择一个图像(一个用于人,一个用于他的车辆)。当我对两者使用完全相同的代码时,其中一个版本很好,我的profileEditViewController代码也很好。当我使用另一个,甚至取消选择一个图像,它不会释放,我的控制器永远不会。完全一样的密码。在两个地方都是100%。

我认为这可以归结为授权保留,但我尝试了不设置委托(因此,它基本上是无用的),同样的结果是显而易见的。只要启动第二个UIImagePickerController,就会产生一个保留锁,甚至为第二个变量声明一个完整的其他变量。只要不启动第二个选择器,我就可以让我的控制器执行任务,但是内存不会丢失。

即使与我的控制器断开连接,它仍在保持。当这种情况出现在苹果公司最严格的例子中,在产品代码中写成字母时,就有点傻了:(

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48506285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档