2011-04-25 3 views
0

J'ai déclaré l'alerte UIAlertView * dans le fichier .h. allouer l'alerte dans func1. et afficher & dans func2. Cela provoquerait un problème de mémoire BAD_EXEC_ACCESS.Pourquoi UIAlertView doit-il être localisé?

-(void) func1 
{ 
alert= [[UIAlertView alloc] initWithTitle:nil message:@"To Confirm." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 

} 

-(void) func2 
{ 
[alert show]; 
[alert release]; 
} 

Si je le fais, c'est OK. Si tout est localisé dans une fonction alors c'est OK. Pourquoi?

-(void) func1 
{ 
alert= [[UIAlertView alloc] initWithTitle:nil message:@"To Confirm." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
[alert show]; 
[alert release]; 
} 

Répondre

-1

Avec l'approche 2 fonction, vous ne retenez pas alerte dans func1, et cette mémoire fuit. Ensuite, lorsque vous accédez à l'alerte (pour l'afficher) dans func2, le compte de retenue est toujours zéro et pourrait déjà avoir été désalloué. Si vous ajoutez

[alert retain]; 

dans func1 du boîtier à double fonction, il devrait fonctionner.

Dans le cas d'une seule fonction, vous allouez, utilisez et relâchez tous dans la même portée, donc il n'y a pas de problèmes de mémoire.

Vous pouvez également déclarer une

@property (nonatomic,retain) UIAlertView *alert; 

dans votre fichier .h, puis comme référence self.alert dans les fonctions. Assurez-vous de le @synthesize et aussi de le libérer dans la méthode dealloc.

+4

'alloc' porte un implicite' retain' avec elle. Je ne pense pas que ce soit le vrai problème - je pense que 'func2' serait appelé plus d'une fois, ce qui libérerait trop l'alerte. –

+0

Je pense que Noah a raison. Je me demande ce que func1 et 2 sont - est-ce que le contrôleur entier est hors de portée entre 1 et 2? – Rayfleck

+0

Le problème a-t-il été résolu? Comment utilisez-vous ces fonctions? Pourriez-vous poster le code? – Sid

-1

Votre alertView perd la portée lorsque vous l'allouez à l'intérieur d'une méthode, puis essayez d'y accéder depuis un autre.

Soit appeler un [alertView retain] après que vous allouez dans func1 (et relâchez une fois que vous avez terminé), ou alloc dans func2

+0

La réponse de Mike dit la même chose mais est mieux formatée donc référez-vous à celui-ci: D – Sid

+0

L'OP dit que 'alert' est déclaré dans le fichier d'en-tête, donc la portée ne devrait pas être un problème. – kubi

+0

Oui, j'ai lu cela et ce que j'ai dit est vrai même dans ce cas. Essayez-le ... – Sid