2010-11-07 24 views
2

J'ai du code qui provoque des fuites de mémoire sur une bibliothèque statique iOS. Voici la vie d'un objet à partir d'instruments:L'objet NSMutableArray remove augmente le nombre de références?

# Category Event Type Timestamp RefCt Address Size Responsible Library Responsible Caller 
0 Table_ColumnListener Malloc 4712087040 1 0x5e5fe60 16 Tests -[Table _initWithRows:andColumns:andTupleType:] 
1 Table_ColumnListener Retain 4712301056 2 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:] 
2 Table_ColumnListener Retain 4712453120 3 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:] 
3 Table_ColumnListener Retain 4712602112 4 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:] 
4 Table_ColumnListener Retain 4712755968 5 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:] 
5 Table_ColumnListener Retain 4712915968 6 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:] 
6 Table_ColumnListener Retain 4713062144 7 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:] 
7 Table_ColumnListener Retain 4729644288 8 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:] 
     /\ 
This is what confuses me 
8 Table_ColumnListener Release 4729646080 7 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:] 
9 Table_ColumnListener Release 4729647872 6 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:] 
10 Table_ColumnListener Retain 4729679104 7 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:] 
11 Table_ColumnListener Release 4729680896 6 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:] 
12 Table_ColumnListener Release 4729682944 5 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:] 
13 Table_ColumnListener Retain 4729713152 6 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:] 
14 Table_ColumnListener Release 4729714944 5 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:] 
15 Table_ColumnListener Release 4729717248 4 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:] 
16 Table_ColumnListener Release 4729731840 3 0x5e5fe60 0 Tests -[Table dealloc] 

Voici le code pour [AbstractColumn addColumnListener:]

-(void) addColumnListener:(id <ColumnListener>)listener 
{ 
[m_listeners addObject:listener]; 
} 

Et pour [AbstractColumn removeColumnListener:]

-(void) removeColumnListener:(id <ColumnListener>)listener 
{ 
[m_listeners removeObject:listener]; 
} 

Lorsque je supprime l'objet de la NSMutableArray, il semble augmentation le nombre de retenue au lieu de décrémentation il. Est-ce que quelqu'un d'autre a eu ce problème et connaît une solution?

+0

C'est en effet très bizarre, mais si vous avez remarqué, seulement un appel sur 3 ou 4 à 'removeColumnListener:' en fait ** '** retient' l'objet, sinon il le libère normalement. Just sayin '- Bonne question néanmoins. –

Répondre

2

Je peux reproduire ce que vous observez avec Instruments. Avant de supprimer votre objet, NSMutableArray le conserve, fait de la magie et le libère. Cette version contrecarre la précédente conserver et n'a rien à voir avec ce qui arrive un peu plus tard: encore une fois, cette fois parce que l'objet est retiré du tableau. Ce que l'implémentation interne du tableau est en train de faire ne devrait pas vous concerner du tout. Il pourrait conserver/libérer l'objet aussi souvent qu'il le souhaite, l'important étant qu'il appelle une fois de plus la libération, car vous vous attendez à ce que l'objet soit supprimé. Ainsi, ce que vous observez

retain 
release 
release 

est très bien et pas de fuite de mémoire du tout. Lors de l'exécution du code dans l'implémentation interne de removeObject :, le retainCount peut augmenter, mais dès que la méthode revient, le nombre est effectivement diminué.

+0

Ok, oui, j'ai regardé ça, et j'étais sur le point de poster ici, et oui, c'est ce qui se passe ... merci pour votre aide! –