2010-06-05 5 views
1

J'ai une liste de lecture appelée NSMutableArray. C'est dans une méthode appelée getAllPlaylists. Le code est quelque chose comme ceci:question de gestion de la mémoire - libérer un objet qui doit être retourné

-(NSMutableArray *)getAllPlaylists 
{ 
    //playlist is an instance variable 
    playlist = [[NSMutableArray alloc] init]; //memory leak here 
    ... 
    //some code here which populates the playlist array 
    [playlist addObject: object1]; 
    ... 
    return playlist; 
} 

L'étape d'allocation de tableau de la liste de lecture provoque une fuite de mémoire. Dans un tel scénario, où puis-je libérer ce tableau? Ou puis-je éviter l'initialisation de la liste de lecture ici en faisant autre chose? Toute aide est la bienvenue!!

Répondre

1

2 solutions:

Utilisez autorelease:

- (NSMutableArray*)getAllPlaylists 
{ 
    playlist = [[NSMutableArray alloc] init]; 
    ... 
    return [playlist autorelease]; 
} 

ou au lieu d'utiliser [[NSMutableArray alloc] init] pour créer votre objet NSMutableArray, utilisation [NSMutableArray array] qui équivaut à [[[NSMutableArray alloc] init] autorelease]:

- (NSMutableArray*)getAllPlaylists 
{ 
    playlist = [NSMutableArray array]; 
    ... 
    return playlist; 
} 
+0

Merci! Mais la dernière fois que j'ai essayé playlist = [NSMutableArray tableau]; l'application s'est écrasée. De toute façon, je vais essayer encore une fois. – ulag

+0

Cela fonctionnera tant que vous n'essayez jamais d'utiliser 'playlist' dans d'autres méthodes de votre classe. Dans ce cas, cela n'aurait aucun sens d'avoir une variable d'instance (cela dépend de ce que vous essayez de faire). – wbyoung

+0

Si vous utilisez 'playlist = [tableau NSMutableArray];' assurez-vous que vous n'essayez pas de le libérer n'importe où. Cela entraînera probablement un accident. – indragie

1

Vous devez libérer automatiquement les objets nouvellement créés que vous souhaitez renvoyer et qui n'appartiennent pas à l'objet (variables locales, pas les variables d'instance).

playlist = [[[NSMutableArray alloc] init] autorelease]; 

Vous pouvez également utiliser la méthode pratique pour faire plus facilement:

playlist = [NSMutableArray array]; 

Pour les articles l'objet possède (variables d'instance), vous devez vous assurer que vous relâchez l'ancienne première valeur et mettre en œuvre une méthode dealloc qui libère également la valeur. Pour plus d'informations, voir le memory management guide.

+0

Merci! Mais, la première fois que getAllPlaylists est appelée, le tableau de playlist n'aura aucune allocation de mémoire à libérer. Ne causera-t-il pas une erreur? – ulag

+0

La première fois que 'getAllPlaylists' est appelée,' playlist' sera 'nil'. Envoyer un message à 'nil' [est autorisé] (http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/Articles/ocObjectsClasses.html#//apple_ref/doc/uid/TP30001163- CH11-SW7) en Objective-C. – wbyoung

+0

Merci, je vais essayer ça. – ulag

Questions connexes