Как избежать утечек памяти в таких отношениях?
@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! */
Если вы не знаете, что аванс root
должен быть освобожден, вам нужно только, чтобы он вам больше не нужен, как и где счетчик ссылок падает до нуля?
Кроме того, приложение Leaks даже обнаружит это как утечку? Я подозреваю, что меня это укусило, поскольку я пытаюсь отследить то, что кажется утечкой, но Утечки утверждают, что у меня нет утечек. Поскольку child по-прежнему ссылается на parent, и наоборот, я осмелюсь сказать, что Leaks считает, что на объекты все еще ссылаются, и, следовательно, не происходит утечка.