2010-03-22 4 views
0

j'ai essayé tout pour déboguer celui-ci, mais je ne peux pas aller au fond de celui-ci.Debugging NSOperation ACCESS BAD dans les graphiques contexte

Ce code vit dans une sous-classe de NSOperation qui est traitée à partir d'une file d'attente:

(frontières est un ivar NSArray contenant 5 objets UIImage)


NSMutableArray *images = [[NSMutableArray alloc] init]; 

for (unsigned i = 0; i < 5; i++) 
    {  

    CGSize size = CGSizeMake(60, 60); 
    UIGraphicsBeginImageContext(size); 

    CGPoint thumbPoint = CGPointMake(6, 6); 

    [controller.image drawAtPoint:thumbPoint]; 

    CGPoint borderPoint = CGPointMake(0, 0); 
    [[borders objectAtIndex:i] drawAtPoint:borderPoint]; 

    [images addObject:UIGraphicsGetImageFromCurrentImageContext()]; 

    UIGraphicsEndImageContext(); 

} 

[images release]; 

Les travaux de code bien la plupart du temps mais quand je pousse l'iPhone par subviews d'accès et en appuyant sur beaucoup de boutons sur l'interface utilisateur que je reçois cette exception soit qui est pris au piège par l'opération:

Exception Load view: *** -[NSCFArray insertObject:atIndex:]: attempt to insert nil 

ou je reçois ceci:

Program received signal: “EXC_BAD_ACCESS”. 

L'exception est due au fait que nul retour UIGraphicsGetImageFromCurrentImageContext().

Je ne sais pas comment déboguer le EXC_BAD_ACCESS mais je devine que cette erreur (en fait ces deux erreurs) est causée par un manque de mémoire. Le débogueur arrête à la ligne:

[controller.image drawAtPoint:thumbPoint]; 

Comme je l'ai mentionné, je l'ai prise au piège à l'exception que je peux vivre avec cela, mais le EXC_BAD_ACCESS est plus grave.

si cela est lié mémoire comment puis-je savoir et est-il possible d'augmenter la mémoire disponible pour NSOperation?

Répondre

1

est le NSOperationQueue en cours de traitement sur le thread principal ou d'un fil d'arrière-plan? Si ce dernier vous ne serez pas en mesure de faire des choses de contexte graphique (ou parfois vous ne le ferez pas parfois).

+0

Il est sur un thread d'arrière-plan (bien la file d'attente est traitée sur le thread principal, mais l'opération se déroule en arrière-plan), le code fonctionne 90% du temps, son seul quand je commence à marteler l'interface qu'il échoue. Pourquoi ne devrais-je pas être en mesure de faire des trucs de contexte graphique sur le thread backround? – Joe

+0

Les appels CoreGraphics sont généralement corrects, mais les appels d'interface utilisateur (tels que "UIGraphicsBeginImageContext") sont généralement uniquement appelables depuis le thread principal. Je ne fais pas les détails les plus fins, mais vous pouvez bien plus d'informations ici: http://www.iphonedevsdk.com/forum/iphone-sdk-development/13963-background-threads-graphics.html – philsquared

+0

Si vous pouvez refondre votre code en utilisant 'CGBitmapContext' vous allez probablement résoudre votre problème. – philsquared