2010-10-01 7 views
0

J'ai un problème avec mon application. Il se bloque après quelques temps de travail avec des images et je ne sais pas pourquoi. J'ai un TabBar, dans un élément de TabBat j'ai un contrôleur de navigation. Dans le contrôleur racine de cette navigation, j'ai deux boutons. Un bouton est d'obtenir une image de la caméra ou de la photothèque, le second bouton est d'obtenir une image à partir d'images enregistrées dans l'application. Avec l'image sélectionnée, je vais au contrôleur suivant (SelectImageViewController).Crash de l'application iPhone

Avec le premier bouton j'utilise ce code:

- (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]; 
} 

Avec le deuxième bouton j'utilise:

DocumentsViewController *documentsViewController = [[[DocumentsViewController alloc] init] autorelease]; 
[self.navigationController pushViewController:documentsViewController animated:YES]; 

DocumentsViewController est un TableViewController avec la liste des images, lorsque je sélectionne une image de I allez dans le SelectImageViewController.

Dans SelectImageViewController, je fais un traitement d'image, puis je passe au contrôleur de vue suivant où je réalise un autre traitement d'image.

Voici un code de 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]; 
} 

Dans le SelectImageViewController j'ai un bouton et quand je clique processus, je l'image originale puis passez au contrôleur suivant la vue. Dans le dernier contrôleur de vue de la méthode viewDidLoad, je traite une fois de plus l'image. Je sais que toutes les méthodes de traitement d'image nécessitent beaucoup de mémoire et de temps (surtout que mon image originale que j'utilise souvent n'est pas mise à l'échelle), mais l'application plante aussi lorsque je sélectionne une image de la photothèque et allez à SelectImageViewController. Peut-être que je ne devrais pas utiliser un contrôleur de navigation? Quelqu'un a-t-il une idée de ce qui ne va pas?

Merci pour toute aide.

+1

Lors d'un examen rapide, rien ne semble mal avec le code. Poster l'exception – Jordan

+0

Avez-vous défini des points d'arrêt à objc_exception_throw et [NSException raise]? Cela peut vraiment aider à identifier le problème. –

+0

Je ne connais pas l'exception. Après quelques fois je commence à ne recevoir que des avertissements de mémoire et parfois je n'ai rien, parfois je reçois des avertissements de mémoire et puis soudainement l'application plante. Je vois dans la console seulement "Program received signal: 0" –

Répondre

0

Faites attention à la libération automatique. Les fonctions renvoient généralement des objets autorelease. Vous êtes dans un pool autorelease, il est donc possible que l'image n'existe pas lorsque vous appelez le dernier sélecteur. Essayez d'attribuer les images en utilisant la méthode de setter

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

que si vous avez déclaré votre variable comme une propriété d'instance avec retenue ou une copie, il conservera l'image. Utilisez NSZombieEnabled pour voir ce qui se passe. Cela semble être un problème classique d'un objet libéré.