iPhone se bloque après commutation, probablement en raison de UIImage imageNamed
-
11-10-2019 - |
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!
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?