2011-05-17 2 views
2

je reçois avertissement de fuite de mémoire quand j'addSubview à courant ViewController .... Ceci est mon code ..mémoire avertissement de fuite en courant addSubview à ViewController

 NoOfGolferViewController *objNoOfGolferViewController = [[NoOfGolferViewController alloc]initWithNibName:@"NoOfGolferViewController" bundle:nil]; 
    [objNoOfGolferViewController setParent:self]; 
    [objNoOfGolferViewController.view setFrame:CGRectMake(15, 110, 290, 330)]; 
    [self.view addSubview:objNoOfGolferViewController.view]; 

et quand je libère l'objet

 [objNoOfGolferViewController release]; 

Demande se brisé en donnant le message EXE_BAD_ACCESS. Comment puis-je résoudre cet avertissement de fuite de mémoire?

Merci à l'avance ..

Répondre

3

Vous devez garder votre objet objNoOfGolferViewController en vie aussi longtemps que son point de vue est visible ou utilisé dans le contrôleur courant. La meilleure solution semble être d'en faire une variable d'instance de votre classe actuelle et de publier objNoOfGolferViewController dans sa méthode dealloc

+2

Merci pour la suggestion –

1

Probablement que vous déclarez une variable localement. Au lieu de le rendre global et le libérer dans dealloc. La raison derrière cela est lorsque vous libérez l'objet, déléguez la méthode releted à qui sont en cours.

OU

Vous pouvez libérer l'objet après avoir enlevé la vue.

+0

Merci pour la suggestion –

0

Généralement, vous obtenez ce message lorsque vous libérez un objet qui a déjà été publié. J'utilise les méthodes ci-dessous (trouvés ici sur SO à iOS4 - fast context switching) pour traquer ce genre de problèmes dans le passé:

#pragma mark - RETAIN DEBUG MAGIC 
// ----------------------------------------------------------------------------- 

- (id)retain 
{ 
    NSLog(@"retain \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]); 
    return [super retain]; 
} 
- (void)release 
{ 
    NSLog(@"release \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]); 
    [super release]; 
} 
- (id)autorelease 
{ 
    NSLog(@"autorelease \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]); 
    return [super autorelease]; 
} 

j'écrit à ce sujet il y a quelques jours ici, à l'aide d'un exemple similaire SO (J'avais des problèmes à retenir et à libérer quelques points de vue). Suivez ce lien si vous êtes intéressé: Understanding iOS Instruments

Bonne chance!

0

juste le rendre autorelease ... comme mentionné ci-dessous

NoOfGolferViewController *objNoOfGolferViewController = [[[NoOfGolferViewController alloc]initWithNibName:@"NoOfGolferViewController" bundle:nil] autorelease];