このような関係でメモリ リークを回避するにはどうすればよいでしょうか。
@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 アプリケーションはこれをリークとして検出しますか? リークと思われるものを追跡しようとしているときに、これに噛まれた可能性があると思いますが、リークはリークがないと主張しています. 子はまだ親を参照しており、その逆も同様であるため、Leaks はオブジェクトがまだ参照されていると見なし、したがってリークしていないと思います。