Question

Hé les gars, cela peut être une chose évidente, mais je ne peux pas comprendre.

Mon application se déplace au hasard 10 UIImageViews autour de l'écran, et une fois un UIImageView frappe le coin, il change son image. Le problème est: après la commutation entre les applications et retourner à la mienne, l'application se bloque.

La console me donne ce message:

"App" exited abnormally with signal 10: Bus error

Le journal indique ce plantage:

Exception Type:  EXC_BAD_ACCESS (SIGBUS)

Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000000000011

Crashed Thread:  0  Dispatch queue: com.apple.main-thread

penser le problème est dû au fait que j'utilise UIImage imageNamed, voici le code:

ViewController.h :

UIImage *red;
UIImage *green;
UIImage *blue;

UIImageView *ballOne;
UIImageView *ballTwo;
UIImageView *ballThree;
UIImageView *ballFour;
// And declare UIImageView for other balls
int clr

ViewController.m :

- (void)viewDidLoad {
  ...
  red = [UIImage imageNamed: @"redTexture.png"];
  green = [UIImage imageNamed: @"greenTexture.png"];
  blue = [UIImage imageNamed: @"blueTexture.png"];
  ...
}
- (void)moveAll:(NSTimer *)theTimer{
  ...
  // If UIImageView touches a corner, Do this:
  clr = arc4random()%3 + 1;
  switch (clr) {
    case 1:
     [ballOne setImage:red];
     break;
    case 2:
     [ballOne setImage:green];
     break;
    case 3:
     [ballOne setImage:blue];
     break;
    default:
     break;
   }
   // And do this for the rest of 9 "balls" 
}

Pourquoi mon accident App, et comment puis-je résoudre?

Merci!

Était-ce utile?

La solution

[UIImage imageNamed:] renvoie une instance autoreleased d'un UIImage. Cela signifie que la mémoire sera libérée dès que la fin de la boucle d'événements.

Yo besoin de retenir ceux par exemple en appelant.

[[UIImage imageNamed:@"blabl.png"] retain]

ou (méthode préférée) par la mise en place de vos membres bleu, rouge, vert comme propriété avec

@property(nonatomic, retain) UIImage* red;

et votre code sera comme:

- (void)viewDidLoad {
  ...
  self.red = [UIImage imageNamed: @"redTexture.png"];
  self.green = [UIImage imageNamed: @"greenTexture.png"];
  self.blue = [UIImage imageNamed: @"blueTexture.png"];
  ...
}

Bien sûr, ne pas oublier de les libérer lorsque votre fait Otherwize vous aurez le contraire de ce que vous avez maintenant. Fuites de mémoire

pour libérer rouge, appel

[red release]

INTHE méthode dealloc.

Autres conseils

Un moyen d'erreur de bus que vous tentez de mémoire que l'unité centrale de traitement d'accès physique ne peut pas. Vous avez probablement un pointeur parasite.

Peut-être essayer le débogueur d'allocation de mémoire?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top