2010-09-23 5 views
0

Tout d'abord, je veux dire que ce site est génial! et cela m'a aidé à faire beaucoup de choses en créant mon application iPhone.Mon application iPhone se bloque après le retour de l'arrière-plan. Cause: problème UIImage

Maintenant, mon problème est:

Quand je lance mon application, j'ai un UIImageView qui charge une image selon une méthode if/else dans

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

. Ces images sont attribuées comme suit:

BG.image = someImage; 

bien sûr, BG est le UIImageView et someImage est un iVar avec @property @synthesis. someImage est initialisé avec une image du faisceau principal viewDidLoad:

- (void)viewDidLoad { 

//init stuff from file 
someImage = [UIImage imageNamed:@"FirstViewBG_5N.png"]; 

[super viewDidLoad];} 

Mon application fonctionne heureusement, le chargement d'images selon touchBegan (comme mentionné), MAIS!

Lorsque mon application est envoyée à l'arrière-plan et revient, elle se bloque dès le premier contact.

Quand je remplace:

BG.image = someImage 

avec:

BG.image = [UIImage imageNamed:@"FirstViewBG_5N.png"]; 

il fonctionne heureusement ?! Je pense que le someImage est rincé ou corrompt?

Je ne veux pas le laisser comme ceci parce que la méthode imageNamed lit à partir du disque à chaque fois, ce qui causera des problèmes de performance, je pense?

Je pense que ma question est claire? C'est ce que:

1- Pourquoi mon appli se bloque-t-elle après le retour de backgroud 2- Comment résoudre ce problème?

Toute votre aide est appréciée! Merci!

Répondre

2

Je suppose que le plantage est EXC_BAD_ACCESS (mais je suppose que vous n'avez pas publié cette information). Si "someImage" est une variable d'instance, vous devez la synthétiser et utiliser son accesseur (self.someImage) pour la conserver ou la copier. En l'état, vous affectez quelque chose à someImage mais il est parti au moment où vous essayez d'y accéder plus tard.

+0

Eh oui! Cela a résolu :) .. Merci beaucoup! Je manque un peu quand il s'agit d'Obj C concepts xP – Mazyod

0

Lorsque vous faites ceci:

- (void)viewDidLoad { 

    //init stuff from file 
    someImage = [UIImage imageNamed:@"FirstViewBG_5N.png"]; 

    [super viewDidLoad]; 
} 

La méthode imageNamed retourne un objet autoreleased qui est nettoyée par le garbage collector après viewDidLoad retours.Vous pouvez soit essayer retenir:

someImage = [[UIImage imageNamed:@"FirstViewBG_5N.png"] retain]; 

ou en utilisant votre setter synthétisé qui conservera automatiquement:

[self setSomeImage:[UIImage imageNamed:@"FirstViewBG_5N.png"]]; 

ou en utilisant initWithData initialiseur de UIImage:

someImage = [[UIImage alloc] initWithContentsOfFile:@"FirstViewBG_5N.png"]; 

Tous sont équivalents. # 2 ou # 3 est le meilleur.

Guide "Règles de gestion mémoire" Apple sauvera votre vie: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html%23//apple_ref/doc/uid/20000994-BAJHFBGH

+0

En fait, je n'ai pas de problème là-bas: p .. Mon problème est quand je n'utilise pas imageNamed .. Joshua a répondu à ça, mais merci! – Mazyod

+0

La récupération de place n'est actuellement pas disponible sur la plate-forme iOS. De plus, conserver/libérer ne fait rien dans un environnement collecté par les ordures. –

+0

Désolé. "nettoyé par la piscine autorelease" – alexantd

Questions connexes