Fuite de mémoire dans loadNibNamed?
-
22-07-2019 - |
Question
Je suis sur le point de terminer ma première application pour iPhone et je me suis dit que je l'exécuterais à l'aide de l'outil Leaks Performance. Après avoir corrigé une erreur évidente, il ne me reste que celle avec un Nib agissant comme une vue d’en-tête de table chargée via loadNibNamed (je suivais la démo Recipes ici).
- (void)viewDidLoad {
[super viewDidLoad];
if (self.tableHeaderView == nil) {
[[NSBundle mainBundle] loadNibNamed:@"TableHeaderView" owner:self options:nil];
self.tableView.tableHeaderView = self.tableHeaderView;
}
}
Puis dans dealloc:
- (void)dealloc {
[tableHeaderView release];
[super dealloc];
}
Instruments me dit que je perds 256 octets et que 2 fuites proviennent de la ligne avec loadNibNamed. tableHeaderView est le seul objet de niveau supérieur du nib (cela a été vérifié dans le débogueur). Y a-t-il quelque chose que j'oublie de libérer? Est-ce que j'interprète mal ce que dit Instruments? Est-ce faux? Est-ce quelque chose que l'OS va nettoyer plus tard?
La solution
Est-ce que Instruments vous dit cela uniquement sur le simulateur, ou est-ce qu'il rapporte la même chose sur un appareil réel? Si vous ne l'obtenez pas sur l'appareil, il s'agit du simulateur - et c'est ce qui se produit (ce n'est pas une correspondance exacte ).
De plus, dans DealLoc, ne s'agirait-il pas de [version de self.tableHeaderView]
? Vous devez être cohérent avec votre utilisation.
Pour éviter toute confusion, dans votre .h, vous déclarez ceci:
NS/UI/??xxxxxx *_MyObjectName; //notice the underscore
Ensuite, la propriété ressemble à ceci:
@property .... NS/UI/??xxxxxx *MyObjectName; //no underscore
Puis synthétisez les getters / setters comme ceci:
@synthesize MyObjectName=_MyObjectName;
Enfin, faites référence à l'objet tout au long du programme avec [self.MyObjectName ...];
Autres conseils
Lorsque vous chargez un nib, vous êtes responsable de la publication de tous les objets de niveau supérieur du fichier nib. Y a-t-il quelque chose dans ce fichier en dehors de TableHeaderView?