2011-09-08 5 views
0

Il s'agit d'une question générale sur les fuites de mémoire. Disons que vous avez le code suivant:Rétention de mémoire et fuites dans iOS

NSObject *object = [[NSObject alloc] init]; 
NSArray *array = [[NSArray arrayWithObjects:object] retain]; 
[object release]; 
[array release]; 

Est-ce une fuite de mémoire? Comme, devrais-je énumérer à travers tous les objets dans le tableau et les relâcher un par un avant de libérer le tableau entier? Ou est-ce que la méthode dealloc de NSArray libère tous les objets qui s'y trouvent et libère le tableau lui-même?

Merci pour toute aide! La gestion de la mémoire peut être assez difficile.

+0

duplication possible de [gestion de la mémoire NSMutableArray] (http://stackoverflow.com/questions/456233/nsmutablearray-memory-management) – PengOne

Répondre

7

Voici quelques règles:

  • chaque fois que vous appelez alloc, vous devez éventuellement appeler release

  • pour chaque retain, vous devriez avoir une release

Lorsque vous ajoutez un objet à un tableau, il appelle retain sur cet objet. Si vous ne libérez pas votre pointeur sur cet objet, ce sera une fuite. Lorsque vous relâchez le tableau, il appellera la libération sur tous les objets qu'il contient, puisqu'il a été appelé précédemment.

NSObject *object = [[NSObject alloc] init]; 
// object has retain count 1 
NSArray *array = [[NSArray arrayWithObjects:object] retain]; 
// array is autoreleased but has a retain, so has retain count 1 
// object now has retain count 2 
[object release]; 
// object now has retain count 1 
[array release]; 
// array is now set to autorelease, 
// once that happens, array will be sent dealloc and object will be released 

Par conséquent, aucune fuite de mémoire.

+0

Merci! Je vous en suis reconnaissant! – Mason

+0

@Mason: De rien. – PengOne