【问题标题】:UIImagePickerController Memory Leak Xcode 9 in Swift 4Swift 4 中的 UIImagePickerController 内存泄漏 Xcode 9
【发布时间】:2018-07-21 21:20:32
【问题描述】:

在我的应用程序中,我使用UIImagePickerController 时发现了内存泄漏,我以为是我的应用程序,但在寻找解决方案时我找到了Apple 的示例,并且我还发现此示例具有相同的内存泄漏。

您可以在以下 URL 中找到示例。

https://developer.apple.com/library/content/samplecode/PhotoPicker/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010196

根据UIImagePickerController 文档:

https://developer.apple.com/documentation/uikit/uiimagepickercontroller

在第 5 点中,您说您必须使用您的委托对象关闭图像选择器,在 Apple 的示例中,UIImagePickerDelegate 正在关闭。

问题是当您选择图像并使用它时,内存泄漏浪费了大约 21 MB 的内存。

无内存泄漏的已用内存

内存泄漏的已用内存

内存泄漏

这是显示UIImagePickerController的代码:

@IBAction func showImagePickerForPhotoPicker(_ sender: UIBarButtonItem) {
    showImagePicker(sourceType: UIImagePickerControllerSourceType.photoLibrary, button: sender)
}

fileprivate func showImagePicker(sourceType: UIImagePickerControllerSourceType, button: UIBarButtonItem) {
    // If the image contains multiple frames, stop animating.
    if (imageView?.isAnimating)! {
        imageView?.stopAnimating()
    }
    if capturedImages.count > 0 {
        capturedImages.removeAll()
    }

    imagePickerController.sourceType = sourceType
    imagePickerController.modalPresentationStyle =
        (sourceType == UIImagePickerControllerSourceType.camera) ?
            UIModalPresentationStyle.fullScreen : UIModalPresentationStyle.popover

    let presentationController = imagePickerController.popoverPresentationController
    presentationController?.barButtonItem = button   // Display popover from the UIBarButtonItem as an anchor.
    presentationController?.permittedArrowDirections = UIPopoverArrowDirection.any

    if sourceType == UIImagePickerControllerSourceType.camera {
        // The user wants to use the camera interface. Set up our custom overlay view for the camera.
        imagePickerController.showsCameraControls = false

        // Apply our overlay view containing the toolar to take pictures in various ways.
        overlayView?.frame = (imagePickerController.cameraOverlayView?.frame)!
        imagePickerController.cameraOverlayView = overlayView
    }

    present(imagePickerController, animated: true, completion: {
        // Done presenting.
    })
}

这是代理中关闭UIImagePickerController的代码:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let image = info[UIImagePickerControllerOriginalImage]
    capturedImages.append(image as! UIImage)

    if !cameraTimer.isValid {
        // Timer is done firing so Finish up until the user stops the timer from taking photos.
        finishAndUpdate()
    } else {
        dismiss(animated: true, completion: nil)
    }
}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    dismiss(animated: true, completion: {
        // Done cancel dismiss of image picker.
    })
}

fileprivate func finishAndUpdate() {
    dismiss(animated: true, completion: { [weak self] in
        guard let `self` = self else {
            return
        }

        if `self`.capturedImages.count > 0 {
            if self.capturedImages.count == 1 {
                // Camera took a single picture.
                `self`.imageView?.image = `self`.capturedImages[0]
            } else {
                // Camera took multiple pictures; use the list of images for animation.
                `self`.imageView?.animationImages = `self`.capturedImages
                `self`.imageView?.animationDuration = 5    // Show each captured photo for 5 seconds.
                `self`.imageView?.animationRepeatCount = 0   // Animate forever (show all photos).
                `self`.imageView?.startAnimating()
            }

            // To be ready to start again, clear the captured images array.
            `self`.capturedImages.removeAll()
        }
    })
}

我仍在寻找解决方案,我们将不胜感激。

【问题讨论】:

  • self.capturedImages.count 应该是`self`.capturedImages
  • 你好@Brandon,谢谢你的回答。很抱歉,但我不明白你想用你建议的改变来完成什么。你能稍微澄清一下吗?
  • @williammr 我得到了同样的错误。你解决了这个问题吗?

标签: ios memory-leaks uiimagepickercontroller swift4 xcode9


【解决方案1】:

我有同样的问题。许多其他人也是如此。可以追溯到 2008 年。非常疯狂。

不幸的是,我能找到的最佳答案是使用单例,这很糟糕。 [IE。有意保留 UIImagePickerController 的一个实例,这样您每次想要选择图像时都可以访问它。] 这是其他人的建议。

此外,我只花了一个小时用使用单例的代码编写了这个答案,但我无法避免内存泄漏[尽管我以为我有一秒钟]。也许我只是做错了 - 请随意尝试。但我不会发布我功能失调的代码作为答案。

最好的答案 [这就是我解决问题的方法] 是使用第三方 pod/库。我使用了 ImagePicker,它快速、快速、免费、美观,而且没有内存泄漏! [麻省理工学院许可证]

在这里查看: https://github.com/hyperoslo/ImagePicker

【讨论】:

  • 为什么这感觉像是广告......?
  • 嗨,克里斯!它不是!我与 ImagePicker 没有任何关系,但我目前在我的 iOS 应用程序中使用它们,并且可以告诉你它有一个缺点 - 很难选择旧图片,因为你必须滚动很多。否则,效果很好!干杯,乔希@ChrisH
猜你喜欢
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 2019-09-06
  • 2011-10-29
  • 2012-05-29
  • 2016-08-17
  • 2011-09-17
  • 1970-01-01
相关资源
最近更新 更多