3

这段代码在模拟器中运行良好,但每次在设备(iPhone 3GS)上崩溃,就在我拍照的时候。这段代码有问题吗?当我使用分配进行概要分析时,当它崩溃时活动内存只有 3-4 MB,所以看起来应用程序没有内存不足。我正在使用ARC。

-(IBAction)chooseImageNew:(UIButton*)sender
{
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{

    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;

    imagePicker.allowsEditing = YES;
    imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

    [self presentModalViewController:imagePicker animated:YES];
}
else {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"No Camera Available." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
}

}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *img = [info objectForKey:@"UIImagePickerControllerEditedImage"];
self.userPicture.image = img;
[self.images replaceObjectAtIndex:0 withObject:img];

[self dismissModalViewControllerAnimated:YES];

}
4

2 回答 2

5

self.userPicture.image = img; 会将图像分配给 UIImageView 吗?

在你这样做之前,你必须调整它的大小,ImagePickerController 回调会为你提供一个 JPEG 表示的图像,但是一旦你在 UIImageView 中显示该图像,数据就会被解码为原始格式。3GS 以 2048x1536 的分辨率拍摄照片,这相当于 12 MB 的数据,这对于 3GS 来说可能已经太多了。

有一些可以调整大小的类别,比如这个优秀的:http: //vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

如果您使用它,只需在分配给 imageView 之前调用它:

UIImage* pickedImage = [sourceImage resizedImageWithContentMode:UIViewContentModeScaleAspectFit bounds:CGSizeMake(960, 960) interpolationQuality:kCGInterpolationHigh];

于 2012-09-02T09:44:17.927 回答
2

当您的方法返回时,您对选择器的引用将被释放。将其设为 ivar:

UIImagePickerController *imagePicker

编辑:另外,在最后一个委托消息之后,不要释放(ARC:nil out)这个 ivar:也就是说,向主线程分派一个块,这样它就完成了一个运行循环旋转![问我怎么知道的:-)]

于 2012-09-02T13:23:18.443 回答