UI 图像选择器在 ios 7/iphone 4s 上崩溃

Posted

技术标签:

【中文标题】UI 图像选择器在 ios 7/iphone 4s 上崩溃【英文标题】:UIImagePicker crashes on ios7/iphone 4s 【发布时间】:2013-10-16 06:12:57 【问题描述】:

我有一个应用程序,它使用 UIImagePickerController 允许用户拍照。

我已将测试用例简化为单个视图控制器应用程序中的最简单序列。这是我的代码。

//
//  CTViewController.h
//  Camera Test
//

#import <UIKit/UIKit.h>

@interface CTViewController : UIViewController <UINavigationControllerDelegate,   UIImagePickerControllerDelegate>

@property (nonatomic, retain) UIImagePickerController *cameraController;

- (IBAction)takePicture:(id)sender;

@end

代码主体如下:

//
//  CTViewController.m
//  Camera Test

#import "CTViewController.h"

....

- (void)didReceiveMemoryWarning

    NSLog(@"%s", __func__);

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


- (IBAction)takePicture:(id)sender

    self.cameraController = [[UIImagePickerController alloc] init];

    self.cameraController.sourceType = UIImagePickerControllerSourceTypeCamera;
    self.cameraController.allowsEditing = YES;
    self.cameraController.delegate = self;
    [self presentViewController:self.cameraController animated:YES completion:nil];

'takePicture' 连接到我可以在屏幕中间按下的按钮。

ios 6 上一切正常,但在 ios 7 上,一旦出现视图控制器,我就会收到一连串的内存警告。因此:

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.
Received memory warning.
-[CTViewController didReceiveMemoryWarning]

.... <here I take a picture, which I do nothing with>

Received memory warning.
-[CTViewController didReceiveMemoryWarning]
Received memory warning.
-[CTViewController didReceiveMemoryWarning]

.... <I get a cascade of these warnings>

该应用程序是使用 xcode 5 使用 ios 7.0 sdk 构建的。如果我使用 ios 6.1 sdk 构建但在 ios7 上运行,则会出现同样的问题。使用 ios 6.1 sdk 构建并在 ios 6.1.3 上运行不会导致任何消息和问题。

我的完整应用程序在 ios 7 上 50% 的时间崩溃。我通过从内存中抛出很多东西(主要是图像)来响应内存警告,并且分析证实了这一点,但我仍然收到一连串警告(即它们在内存被释放后继续)。

如果我使用前置摄像头、从图库中选择或使用 iPad 3,则没有消息。因此我怀疑内存问题与使用后置摄像头时 UIImagePickerController 的大小有关。

我已经充分探索了 ***,并特别关注了这篇文章 - UIImagePickerController error: Snapshotting a view that has not been rendered results in an empty snapshot in iOS 7

我已经尝试了所有建议,但我的简单测试应用排除了大部分解释。

有什么想法吗?我应该放弃对 iPhone 4S 的支持吗?我还没有确认 iPhone 5 上的问题,但我会尽快更新这个问题。

:-)

【问题讨论】:

我们也遇到了同样的问题,即在装有 iOS7 的 iPhone 4s 上查看并接受照片后相机崩溃。 这很奇怪,所以我不提供它作为答案。我有完全相同的问题,但在 iPhone 5s 上。花 4 个小时倾倒堆栈溢出并四处询问。最后,我重新启动了我的 iPhone 5s 并且噗,没有更多的内存警告。他们可能会返回,但在使用问题应用程序拍照 2 小时后,仍然没有内存警告。奇怪! 这似乎“修复”了它。什么鬼…… 这可能与 ios7 尝试拍摄您的应用的快照视图以便在控制面板中显示它有关 我花了半天时间调试它,Jim 的重启答案解决了它... Jim 请提交它作为答案! 【参考方案1】:

我建议您不要使用图像选择器的属性,而是使用本地对象。请参阅下面我在 IOS7 上也可以正常工作的代码。

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])

    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
    imagePicker.showsCameraControls = YES;

    [self presentViewController:imagePicker animated:YES completion:nil];

【讨论】:

你能扩展一下这个建议吗?我有一个带有自定义叠加层的应用程序,我将 imagePicker 的引用传递给叠加层控制器,这样我就可以在叠加层 IBAction 中调用 takePhoto:[self.cameraPickerRef takePicture] 另外,当我切换相机设备时,我向 self.imagePicker.view 添加了一个自定义黑色子视图,因此过渡效果更好一些。在这个方法中,我需要引用imagePicker来添加子视图和设置摄像头设备。 这样一拍照片就会被释放,但如果你需要一个强有力的参考,那就更复杂了。 好吧,我想我的 CameraViewController 中的强引用 可以 被消除,但我仍然需要对我的 CameraOverlayViewController 中的选取器的引用,这样我才能真正调用 takePhoto。我只是不确定消除强 ref 是否会治愈,尤其是因为这已特定于 iPhone 4S。我热衷于在适当的地方设置 self.imagePicker = nil 我遇到了同样的问题,我也尝试了这两个 SDK 版本。它只在 iPhone4 iOS7 上给出内存警告,但在 iPhone4 ios7 上它大部分时间都会崩溃。

以上是关于UI 图像选择器在 ios 7/iphone 4s 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

离子图像选择器和选择器在 IOS 中不起作用

Flutter 图像选择器在带有 Mac M1 芯片模拟器的 ios 14 中不起作用

JQuery UI 日期选择器在 Chrome 中不起作用

angular-ui:日期选择器在显示按钮时似乎挂起 angularjs

为啥 jQuery UI 日期选择器在 jQuery 对话框模式中不起作用?

jquery ui对话框中的基础日期选择器在Internet Explorer中不起作用