2009-08-26 4 views
2

Je nettoie mon code dans une application iPhone du répertoire et l'outil Fuites dans Instruments signale que je fuis des objets NSCFString. Voici le modèle que je suivais:Objectif C NSCFString Leaks avec NSMutableArrays

J'ai une classe de personne dans ma demande qui n'a plus rien que les membres de NSString locaux et propriétés associées pour le prénom, le nom, etc.

Mon contrôleur de vue a un Propriété NSMutableArray remplie à partir d'une base de données SQLite dans l'événement searchBarSearchButtonClicked. Ce NSMutableArray est rempli avec les objets Person qui seront utilisés pour remplir mon contrôle tableview. En outre, si l'utilisateur clique sur une personne dans la vue, son objet Personne sera transmis à la vue Détails pour afficher des informations supplémentaires, pas seulement le nom.

Lorsque j'effectue ma première recherche et affiche les résultats, il n'y a pas de fuite de mémoire.

Maintenant, lorsque j'effectue ma deuxième recherche, je voudrais idéalement effacer le NSMutableArray et le recharger avec le nouveau jeu de résultats sans fuites de mémoire. Donc, pour ce faire, je l'appelle removeAllObjects sur ma propriété PersonList puis appelle la base de données pour repeupler la PersonList NSMutableArray comme indiqué ci-dessous:

[self.personList removeAllObjects]; 
self.personList = [SearchService GetPersonList:searchText]; 
[list reloadData]; 

En appelant removeAllObject J'ai réussi à se débarrasser des fuites que je l'habitude d'avoir qui étaient associés aux objets Person. Cependant, il semble que je fuit maintenant les objets NSString laissés par les propriétés des objets Person individuels.

Est-ce possible? Je suis novice dans l'outil Instruments, mais d'après ce que je peux voir à partir des détails étendus lorsque j'exécute une des fuites de NCSFString, la dernière ligne de code pointe souvent vers la ligne de code @synthesize pour la propriété, tels que:

@synthesize firstName; 

Alors, voilà pourquoi je pense que ces NSStrings ne reçoivent pas nettoyé. Y at-il une meilleure façon de faire cela qui ne produit pas de fuites de mémoire?

+0

Si vous pouvez publier le code pour votre classe Personne, il peut être plus facile de diagnostiquer ce qui se passe. – Mark

Répondre

3

Libérez-vous les NSString s dans la méthode dealloc pour votre classe Personne?

En supposant que vous configurez votre propriété comme si:

@property (retain) NSString *firstName; 

Lorsque vous définissez firstName en utilisant le dispositif de réglage, il sera retenu. Si l'instance Person est alors libérée et désaffectée, mais que firstName n'a pas été libérée, elle fuira.

Mettez dans la méthode dealloc dans votre Person classe:

- (void)dealloc 
{ 
    [firstName release]; 
    [super dealloc]; 
} 

(En supposant que le Ivar correspondant qui est utilisé pour votre firstName propriété est appelée firstName).

+0

Cela semble fonctionner. Cependant, l'analyseur de code dans XCode 3.2.1 commente ma version dans la méthode dealloc: "La décrémentation incorrecte du nombre de références d'un objet n'appartient pas à ce point à l'appelant". Des idées? – rtemp

+0

L'analyseur de code considère l'utilisation des méthodes d'accès dans '-dealloc' comme un bug et vous avertit de cela - il y a un débat sur l'utilisation des accesseurs dans' init' et 'dealloc' mais je pense que le consensus général est de effacer et accéder aux ivars directement (désolé, aurait dû le signaler avant). –

+0

Cela a fonctionné pour moi bien que ma configuration de propriété ait été: @property (nonatomic, assign) NSString * name; –