【发布时间】:2018-07-21 21:20:32
【问题描述】:
在我的应用程序中,我使用UIImagePickerController 时发现了内存泄漏,我以为是我的应用程序,但在寻找解决方案时我找到了Apple 的示例,并且我还发现此示例具有相同的内存泄漏。
您可以在以下 URL 中找到示例。
根据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