iPhone应用程序崩溃

时间:2010-10-01 16:59:50

标签: iphone image crash

我的申请有问题。几次使用图像后它崩溃了,我不明白为什么。 我有一个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。也许我不应该使用导航控制器?有谁知道什么是错的?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

注意自动释放​​。函数通常返回自动释放对象。您在自动释放池中,因此,当您调用最后一个选择器时,图像可能不存在。尝试使用de setter方法

分配图像

[self setProcessedImage:[ImageHelper scaleImage:self.originalImage maxWidth:320 maxHeight:367]];

只有当您将变量声明为具有retain或copy的实例属性时,它才会保留图像。 使用NSZombieEnabled查看会发生什么。这似乎是一个自由对象的经典问题。