2010-11-22 6 views
1

J'ai écrit un qui fonctionne bien, mais je l'ai testé avec des instruments pour les fuites et est venu à travers des fuites de UIBarButtonContent voici les lignes fautives.iPhone SDK UIBarButton Memory Leaks

 UIButton *searchbutton = [UIButton buttonWithType:UIButtonTypeCustom]; 
[searchbutton setImage:[UIImage imageNamed:@"searchbutton.png"] forState:UIControlStateNormal]; 
[searchbutton addTarget:self action:@selector(search) forControlEvents:UIControlEventTouchUpInside]; 
[searchbutton setFrame:CGRectMake(0, 0, 29,29)]; 
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:searchbutton]; 

Suis-je censé libérer searchButton ou self.navigationItem.rightBarButtonItem partout.

Une aide serait géniale.

Vive

Répondre

7

Vous devez libérer votre UIBarButtonItem:

self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:searchbutton] autorelease]; 
+0

@iamsmug - Si vous regardez la documentation de rightBarButtonItem, il dira: '@property (nonatomic, retain) UIBarButtonItem * rightBarButtonItem' qui signifie qu'il conservera l'élément. Parce que vous l'avez alloué, vous devez également le libérer/autorelease, sinon le nombre de retenue sera de 2 et vous aurez une fuite de mémoire. –

0

Vous devez libérer UIBarButtonItem référence que vous avez alloc là.

0

Chaque fois que vous allouez, vous êtes responsable de la libération. Vous ne savez pas ce qui se passe dans votre code si vous le publiez juste après votre dernière ligne, si vous voyez des problèmes, vous pouvez essayer d'utiliser autorelease à la place.

+0

Si je publie l'analyseur UIBarButtonItem dit 'Le message' release 'devrait être envoyé aux instances de la classe' UIBarButtonItem 'et non directement à la classe' – iamsmug

+0

iamsung, vous ne pouvez pas appeler release sur UIBarButtonItem, vous devez appeler release sur l'instance de UIBarButtonItem que vous avez créé. De la façon dont vous le créez, vous n'avez jamais votre propre pointeur sur l'instance à laquelle vous pouvez accéder. Vous pouvez utiliser autorelease pour gérer cela, comme indiqué dans ma réponse, ou vous pouvez créer votre propre instance sur une ligne séparée à partir de laquelle vous l'affectez à rightBarButtonItem. – GendoIkari

+0

Oui merci, je suis trié maintenant. – iamsmug