我的申请有问题。几次使用图像后它崩溃了,我不明白为什么。 我有一个TabBar,在TabBat的一个项目中我有一个导航控制器。在该导航的根控制器中,我有两个按钮。一个按钮是从相机或照片库中获取图像,第二个按钮是从应用程序中保存的图像中获取图像。使用选定的图像,我转到下一个视图控制器(SelectImageViewController)。
使用第一个按钮,我使用该代码:
- (void) showImagePickerWithSourceType:(NSInteger) sourceType
{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = sourceType;
picker.allowsEditing = NO;
[self presentModalViewController:picker animated:YES];
[picker release];
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *selectedImage = (UIImage *)[info objectForKey:@"UIImagePickerControllerEditedImage"];
if (selectedImage == nil)
selectedImage = (UIImage *)[info objectForKey:@"UIImagePickerControllerOriginalImage"];
[[picker parentViewController] dismissModalViewControllerAnimated:YES];
SelectImageViewController *selectImageViewController = [[[SelectImageViewController alloc] initWithImage:selectedImage] autorelease];
[self.navigationController pushViewController:selectImageViewController animated:YES];
}
使用第二个按钮:
DocumentsViewController *documentsViewController = [[[DocumentsViewController alloc] init] autorelease];
[self.navigationController pushViewController:documentsViewController animated:YES];
DocumentsViewController是一个带有图像列表的TableViewController,当我选择一个图像时,我选择的是SelectImageViewController。
在SelectImageViewController中,我进行了一些图像处理,然后转到下一个视图控制器进行另一个图像处理。
以下是SelectImageViewController的一些代码:
- (id) initWithImage:(UIImage *) image
{
self = [super init];
if (!self) return nil;
self.originalImage = image;
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor grayColor];
[NSThread detachNewThreadSelector:@selector(processImage) toTarget:self withObject:nil];
}
- (void) processImage
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
self.originalImage = [ImageHelper scaleAndRotateImage:self.originalImage toSize:CGSizeMake(1500, 1500)];
self.processedImage = [ImageHelper scaleImage:self.originalImage maxWidth:320 maxHeight:367];
[self performSelectorOnMainThread:@selector(finish) withObject:nil waitUntilDone:NO];
[pool release];
}
- (void) finish
{
imageView = [[UIImageView alloc] initWithImage:self.processedImage];
imageView.center = self.view.center;
[self.view addSubview:imageView];
[self.view sendSubviewToBack:imageView];
[NSThread detachNewThreadSelector:@selector(processImage2) toTarget:self withObject:nil];
}
- (void) processImage2
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSArray *corners = [OpenCV processImage:self.processedImage];
[self performSelectorOnMainThread:@selector(finish2) withObject:nil waitUntilDone:NO];
[pool release];
}
在SelectImageViewController中,我有一个按钮,当我单击它时,我处理原始图像,然后转到下一个视图控制器。 在viewDidLoad方法的最后一个视图控制器中,我再处理一次图像。
我知道所有用于图像处理的方法都占用了大量内存和一些时间(特别是我经常使用的原始图像没有缩放),但是当我只选择照片库中的图像时,应用程序也崩溃了到SelectImageViewController。也许我不应该使用导航控制器?有谁知道什么是错的?
感谢您的帮助。
答案 0 :(得分:0)
注意自动释放。函数通常返回自动释放对象。您在自动释放池中,因此,当您调用最后一个选择器时,图像可能不存在。尝试使用de setter方法
分配图像 [self setProcessedImage:[ImageHelper scaleImage:self.originalImage maxWidth:320 maxHeight:367]];
只有当您将变量声明为具有retain或copy的实例属性时,它才会保留图像。 使用NSZombieEnabled查看会发生什么。这似乎是一个自由对象的经典问题。