2010-08-11 2 views
1

Je suis nouveau dans le développement de l'iPhone, et je viens de lancer mon application iPhone via l'outil Intruments Leaks pour la première fois, et j'ai découvert une fuite avec ma méthode dataArray de ListViewController.Aide pour la fuite de mémoire de l'iPhone

Lorsque je clique sur la liste, le code s'affiche et quelques lignes ont des pourcentages à côté d'eux. Vraisemblablement, ils sont les lignes qui fuient la mémoire. J'ai collé le code et les pourcentages ci-dessous:

- (NSArray*) dataArray { 
    MapViewController *map = mainWindow.mainView.mapView; 
NSMutableArray *data = [NSMutableArray arrayWithCapacity: 0]; /** REPORTS 25.3% HERE **/ 

if (selectedIndex == 1 || selectedIndex == 0) 
[data addObjectsFromArray: DataSource.data]; /** REPORTS 7.4% HERE **/ 

if (selectedIndex == 2 || selectedIndex == 0) 
[data addObjectsFromArray: DataSource.additionalData]; /** REPORTS 67.4% HERE **/ 

    [data sortUsingSelector:@selector(compareAnnotation:)]; 

    dataArrayNeedsUpdating = NO; 
[data retain]; 
dataArray = data; 

    return data; 
} 

Est-ce que je peux changer ce code pour éviter la fuite, ou aura des changements doivent être faits dans le code d'appel?

Merci à l'avance,

Ben

Répondre

5

Si tableauDonnees stocke une valeur lorsque cette méthode est appelée, elle va fuir, parce que vous n'êtes pas libérer l'ancienne valeur avant de l'écraser. La solution simple est d'utiliser un setter (probablement celui généré par @synthesize) et changer les lignes

[data retain]; 
dataArray = data; 

au

[self setDataArray:data]; 

plus simple (et plus conventionnel) ou, si vous préférez,

self.dataArray = data; 

La différence entre

myMemberVariable = somePointerToAnObject; 

et

self.myMemberVariable = somePointerToAnObject; 

est l'un des pièges subtils pour le nouveau codeur Objective-C.

+0

Cela semble certainement l'avoir corrigé, merci! Pouvez-vous expliquer (ou créer un lien vers) la différence entre myMemberVariable et self.myMemberVariable? –

+0

Les variables d'objet (que vous définissez dans @interface dans vos fichiers .h) sont des variables locales dans toutes vos méthodes objet (celles définies avec '-' avant le type de retour, contrairement aux méthodes de classe, qui sont '+ '). Ainsi, vous pouvez toujours vous référer à votre variable directement par son nom. C'est ce que tu as fait. La notation par points est un raccourci pour les propriétés. Si vous l'utilisez pour accéder à la valeur, la méthode portant le même nom est appelée (par exemple [self myMemberVariable]) et si vous l'utilisez pour définir la valeur, [self setMyMemberVariable] est appelée. Normalement vous faites ces méthodes automatiquement quand ... –

+0

... vous @synthesize une propriété. Le setter est ce qui est pertinent ici. Le setter créé automatiquement libère l'ancienne valeur (si la propriété est une propriété 'retain'), conserve la nouvelle valeur et définit la variable. Tout ceci serait un peu plus clair, mais la convention consiste à nommer votre propriété avec le même nom que votre variable d'instance (ou "ivar"), de sorte que le résultat final est qu'ils sont très similaires. –