0

J'ai une classe, qui gère essentiellement les données de base. insère supprime et met à jour les données. Je cette classe initialise comme siIphone: Est-ce une mauvaise idée? Gestion de la mémoire/Problème de fuite

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     self.itemList = [NSDictionary dictionaryWithObjectsAndKeys: // <== LEAKS 
        ITEMURL1, KEY1, 
        ITEMURL2, KEY2, 
        ITEMURL3, KEY3, 
        ITEMURL4, KEY4, 
        ITEMURL5, KEY5, 
        nil]; 
     self.storedItems = [[NSMutableArray alloc] init]; // <== LEAKS 

    } 
    return self; 
} 


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

J'ai pris soin que je libère tous les objets soigneusement. quand il est alloué, mais je semble toujours avoir des fuites à init lorsque je lance l'application dans Instruments.

Que se passe-t-il? Est-ce que je fais quelque chose de mal?

Répondre

0

En ce qui concerne storedItems:

si storedItems est déclarée comme

@property (nonatomic, retain) NSMutableArray *storedItems; 

(Retain partie est importante) alors vous devez faire:

NSMutableArray *storedItems_ = [[NSMutableArray alloc] init]; 
self.storedItems = storedItems_; 
[storesItems_ release]; 

alloc + init faire votre object9 ¥ 's retain count va à 1. Ensuite, l'utilisation de self.xxx le conservera comme déclaré dans les attributs de votre propriété. Par conséquent, il sera 2. Cela ne se produira pas avec assign

+0

Merci qui se sont arrêtés storedItems de fuir. Je ne comprends pas vraiment, pourquoi faire cette étape? n'est-ce pas la même chose que ce que je faisais? – Rupert

+0

itemList fuit toujours .. est-ce à cause des constantes? – Rupert

+0

Il y a une explication ici: http://nacho4d-nacho4d.blogspot.com/2010/08/notes-on-memory-management-in-objective.html. Et en ce qui concerne itemList, comment itemList est déclaré? – nacho4d

1

Vous devez ajouter [version itemList] à votre méthode dealloc (en supposant que vous avez « conserver » dans la déclaration de propriété.

Quant à storedItems, si vous avez conserver dans la déclaration de propriété, vous devez autoRelease quand vous lui attribuez:

self.storedItems = [[[NSMutableArray alloc] init] autorelease]; 

Ou de façon plus concise, mais équivalente:

self.storedItems = [NSMutableArray array]; 
+1

Si vous utilisez des propriétés, préférez 'self.itemList = nil; self.storedItems = nil; '. –

Questions connexes