сбой приложения iPhone - PullRequest
       9

сбой приложения iPhone

0 голосов
/ 01 октября 2010

У меня проблема с моим приложением. Он падает после нескольких раз работы с изображениями, и я понятия не имею, почему. У меня есть 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 я еще раз обрабатываю изображение.

Я знаю, что все методы обработки изображений занимают много памяти и некоторое время (особенно то, что мое исходное изображение, которое я часто использую, не масштабируется), но приложение также вылетает, когда я выбираю только изображение из библиотеки фотографий и выхожу выбрать ImageViewController. Может мне не стоит использовать навигационный контроллер? Кто-нибудь знает, что может быть не так?

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 02 октября 2010

Позаботьтесь об авторелизе.Функции обычно возвращают объекты автоматического освобождения.Вы находитесь в пуле автоматического выпуска, поэтому, возможно, изображение не будет существовать при вызове последнего селектора.Попробуйте назначить изображения с помощью метода de setter

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

, только если вы объявили переменную как свойство экземпляра с помощью функции retain или copy, она сохранит изображение.Используйте NSZombieEnabled, чтобы увидеть, что происходит.Кажется, это классическая проблема освобожденного объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...