2010-10-01 3 views
0

У меня проблема с моим приложением. Он падает после нескольких раз работы с изображениями, и я понятия не имею, почему. У меня есть TabBar, в одном элементе TabBat у меня есть контроллер навигации. В корневом контроллере этой навигации у меня есть две кнопки. Одна кнопка - получить изображение из камеры или библиотеки фотографий, вторая кнопка - получить изображение из сохраненных изображений в приложении. С выбранным изображением я перехожу к следующему контроллеру представления (SelectImageViewController).Ошибка приложения iPhone

С первой кнопкой я использую этот код:

- (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

При быстром просмотре ничего не получается с кодом. Отправьте исключение. – Jordan

+0

Вы установили контрольные точки в objc_exception_throw и [NSException raise]? Это может помочь выявить проблему. –

+0

Я не знаю исключения. После нескольких раз я начинаю получать только предупреждение о памяти, а иногда иногда ничего не получаю, иногда получаю предупреждения о памяти, а затем внезапно сбой приложения. Я вижу только в консоли «Программный принятый сигнал: 0» –

ответ

0

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

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

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

Смежные вопросы