【问题标题】:iOS 7 crashes BAD_ACCESS when using UIImagePickerControlleriOS 7 在使用 UIImagePickerController 时崩溃 BAD_ACCESS
【发布时间】:2014-03-02 11:30:37
【问题描述】:

我正在尝试使用 UIImagePickerController 让我的用户选择照片或拍摄照片以在我的应用程序中使用。但是,每当从他们的照片中选择图像或选择使用拍摄的照片时,该应用程序似乎大部分时间都会崩溃。我使用了 NSZombie 对象并收到以下消息:

[NSISRestrictedToNonNegativeVariable retain]:消息发送到已释放实例 0x168c3530

我不知道这里发生了什么。当我偶尔展示一个模态视图时,也会出现同样的问题。

这是我展示 UIImagePickerController 和处理响应的代码:

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
    {
        if ([[actionSheet buttonTitleAtIndex:buttonIndex] isEqualToString:CANCEL_TITLE]) {
            return;
        }
        UIImagePickerControllerSourceType sourceType = buttonIndex == 0 ? UIImagePickerControllerSourceTypePhotoLibrary : UIImagePickerControllerSourceTypeCamera;
        UIImagePickerController* controller = [[UIImagePickerController alloc] init];
        controller.sourceType = sourceType;
        [controller setDelegate:self];
        if (buttonIndex == 1) {
            //PNCoverOverlayView* overlayView = [PNCoverOverlayView viewWithNibNamed:nil];
            //[controller setCameraOverlayView:overlayView];
            [controller setShowsCameraControls:YES];
        }
        [self presentViewController:controller animated:YES completion:nil];
    }

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
    {
        [picker dismissViewControllerAnimated:YES completion:^{
            UIImage* originalImage = info[UIImagePickerControllerOriginalImage];
            _imageToUpload = originalImage;
            CGFloat scaleAdjust = ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2) ? 0.5 : 1;
            CGFloat length = LENGTH * scaleAdjust;
            if ([picker sourceType] == UIImagePickerControllerSourceTypeCamera) {
                PNCoverOverlayView* overlay = (PNCoverOverlayView*)[picker cameraOverlayView];
                CGSize overlaySize = [overlay frame].size;
                UIImage* cropped = [UIImage imageCroppedToSize:overlaySize fromImage:originalImage];
                _imageToUpload =[UIImage imageResizedToSize:CGSizeMake(length, length) fromImage:cropped];
            } else {
                _imageToUpload = [UIImage imageScaledToMaximumLength:length fromImage:originalImage];
            }
            [self performSegueWithIdentifier:@"reviewPhotoUpload" sender:self];
        }];
    }

我注释掉了向 UIImagePickerController 添加自定义叠加层,因为这修复了应用程序在呈现 UIImagePickerController 时崩溃

【问题讨论】:

  • 您的问题解决了吗?
  • 没有。我的问题没有解决
  • 遇到同样的问题,还是没找到解决办法。

标签: ios iphone objective-c ios7


【解决方案1】:

您应该检查以下事项:

  1. 你是在设备上测试它吗?

  2. 按照苹果指南Overview 中提到的步骤操作,并注意您正在运行的设备。例如。, iPhone 或 iPad。

  3. 还要检查isSourceTypeAvailable

  4. 另外,检查isCameraDeviceAvailable 属性。

  5. 在尝试获取cameraOverlayView 时,您应该检查它是否不是nil。有关更多信息,请参阅此属性的文档 信息。

希望对你有帮助!

【讨论】:

    【解决方案2】:

    您正在函数中实例化控制器:

    UIImagePickerController* controller = [[UIImagePickerController alloc] init];

    你应该在你的类中保持对控制器的强引用,一个 ivar 将是一个不错的选择。

    【讨论】:

    • 当您立即展示控制器并由presentingController 保留时,您实际上并不需要保留强引用,只要它没有被解雇。所有选择器回调都在被解除之前进行。
    猜你喜欢
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    相关资源
    最近更新 更多