1

2 つのオブジェクトが互いに保持されている場合、クロス保持状況をどのように回避しますか?

このクラス構造を考えてみましょう:

Container.h

@interface Container : NSObject {
    NSObject *child;
}

@property (nonatomic, retain) NSObject *child;
@end

コンテナ.m

@implementation Container

@synthesize child;

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

@end

次に、メモリ保持カウントをテストする場合:

- (void)testDoubleRetain {
    Container *A = [[Container alloc] init];
    Container *B = [[Container alloc] init];

    NSLog(@"A retainCount: %d", [A retainCount]);//returns 1
    NSLog(@"B retainCount: %d", [B retainCount]);//returns 1
    [A setChild:B];
    [B setChild:A];

    NSLog(@"A retainCount: %d", [A retainCount]);//returns 2
    NSLog(@"B retainCount: %d", [B retainCount]);//returns 2

    [A release];
    [B release];

    NSLog(@"A retainCount: %d", [A retainCount]);//returns 1
    NSLog(@"B retainCount: %d", [B retainCount]);//returns 1
}

したがって、私の理解では、保持カウントは正しいカウントを示しているはずです。しかし、実際にオブジェクトの割り当てを解除するにはどうすればよいでしょうか。このコード ブロックの後、これら 2 つのオブジェクトはメモリ内にとどまるからです。

4

2 に答える 2

2

簡単な回避策は、オブジェクト自体を解放する前に子を nil することです。

A.child = nil;
[A release];

しかし、あなたの問題を回避するために、一般的なプログラム構造を再考する価値があるかもしれません.2つのオブジェクトを相互に保持する必要はありません.それらは他の手段によって時期尚早に割り当て解除されることはありません-たとえば、それらすべてを何らかのグローバルコンテナに入れることによって-すべては実際のコンテキストに依存します)

于 2011-05-06T14:32:31.347 に答える
1

まず、retainCount を使用しないでください。それはあなたが思うことをしません。

ここで行う通常のことは、子またはコンテナのいずれかが他方を保持しないようにすることです。これにより、サイクルが中断されます。それが不可能な場合は、明示的に呼び出さなければならない関数を提供して、コンテナーに作業が完了したことを伝え、その時点で子を解放します。

于 2011-05-06T14:33:59.847 に答える