Comment éviter les fuites de mémoire dans une relation comme celle-ci?Objectif-C: Références circulaires type enfant-parent, fuite?
@class Node;
@interface Node : NSObject {
Node *parent;
Node *child;
id object;
}
-(id)initWithObject:(id)anObject;
-(id)object;
-(void)setChild:(Node *)aNode;
-(void)setParent:(Node *)aNode;
@end
@implementation Node
-(id)initWithObject:(id)anObject {
if (self = [self init]) {
object = [anObject retain];
}
return self;
}
-(id)object {
return object;
}
-(void)setParent:(Node *)aNode {
[parent release];
parent = [aNode retain];
}
-(void)setChild:(Node *)aNode {
[child release];
child = [aNode retain];
[child setParent:self];
}
-(void)dealloc {
[child release];
[parent release];
[super dealloc];
}
@end
Node *root = [[Node alloc] initWithObject:@"foo"]; // root retain = 1
Node *child = [[Node alloc] initWithObject:@"bar"]; // child retain = 1
[root setChild:child]; // child retain = 2, root retain = 2
[root release]; // root retain = 1
[child release]; // child retain = 1
/* Leaking! */
Si vous ne savez pas à l'avance root
devriez dealloc'd, vous vous souciez seulement que vous ne avez plus besoin, comment et d'où la baisse de comptage de référence à zéro?
De plus, l'application Leaks détecterait-elle même cela comme une fuite? Je soupçonne que j'ai peut-être été mordu par ce que j'essaie de traquer ce qui semble être une fuite, mais les fuites prétend que je n'ai pas de fuite. Puisque l'enfant fait toujours référence au parent, et inversement, j'ose dire que Leaks considère que les objets sont toujours référencés, et donc ne fuit pas.
Parfait, merci. En bref, utilisez l'affectation dans '-setParent:' et dans la méthode '-dealloc' envoyez' setParent: nil' à l'enfant. Cela a un sens parfait. – d11wtq
Désolé, une dernière chose. Ai-je raison de penser que ce type de fuite de mémoire serait invisible pour un outil de détection de fuites? – d11wtq
Je ne suis pas sûr de cela, ça fait un moment que j'ai utilisé des fuites :( – GWW