1

クラスでこのコードを取得しました:

- (void)cancel {
    if (_cancelBlock)
        _cancelBlock();
}
- (void)overrideCancelWithBlock:(void(^)(void))cancelBlock {
    [_cancelBlock release];
    NSLog(@"AsyncOperation-overrideCancelWithBlock-[cancelBlock retainCount]=%lu (before)", [cancelBlock retainCount]);
    _cancelBlock = [[cancelBlock copy] retain];
    NSLog(@"AsyncOperation-overrideCancelWithBlock-[_cancelBlock retainCount]=%lu (after)", [_cancelBlock retainCount]);
}

- (void)dealloc
{
    NSLog(@"AsyncOperation-dealloc-[_cancelBlock retainCount]=%lu (before)", [_cancelBlock retainCount]);
    [_cancelBlock release];
    NSLog(@"AsyncOperation-dealloc-[_cancelBlock retainCount]=%lu (after)", [_cancelBlock retainCount]);
    [super dealloc];
}

この NSLog() の出力は次のとおりです。

 AsyncOperation-overrideCancelWithBlock-[cancelBlock retainCount]=1 (before)
 AsyncOperation-overrideCancelWithBlock-[_cancelBlock retainCount]=1 (after)
 AsyncOperation-dealloc-[_cancelBlock retainCount]=1 (before)
 AsyncOperation-dealloc-[_cancelBlock retainCount]=1 (after) 

copyメソッドのドキュメントには、次のように書かれています。

特別な考慮事項

マネージ メモリ (ガベージ コレクションではない) を使用している場合、このメソッドは新しいオブジェクトを保持してから返します。ただし、メソッドの呼び出し元は、返されたオブジェクトを解放する責任があります。

そう。NSLog() の出力が常に同じ値を示す方法はretainCount?

4

2 に答える 2

2
_cancelBlock = [[cancelBlock copy] retain];

それはブロックを過剰に保持します。ただ-それをコピーします。


ブロックは、実行時に実行されたアクションに基づいてフォームを変更し、実装の詳細に基づいてコンパイル時にタイプを変更できるため、さまざまなブロッククラスは通常retainCount、ナンセンスジェネレーターとして扱われます。場合によっては、これは常に1を返すことを意味します。

retainCountゼロのaは、すべての場合において論理的に不可能であることに注意してください。

于 2011-03-08T17:27:33.360 に答える
2

ドキュメントretainCountは次のように書かれています:

重要: 通常、この方法は、メモリ管理の問題をデバッグする際には役に立ちません。オブジェクトへの参照を保持するために任意の数のフレームワーク オブジェクトがオブジェクトを保持している可能性があると同時に、自動解放プールがオブジェクトの任意の数の延期されたリリースを保持している可能性があるため、これから有用な情報を取得できる可能性はほとんどありません。方法。

従わなければならないメモリ管理の基本ルールを理解するには、「メモリ管理ルール」を読んでください。メモリ管理の問題を診断するには、適切なツールを使用します。

通常、LLVM/Clang 静的アナライザーは、プログラムを実行する前であってもメモリ管理の問題を検出できます。
Instruments アプリケーションの Object Alloc Instrument (Instruments User Guide を参照) は、オブジェクトの割り当てと破棄を追跡できます。
Shark (Shark User Guide を参照) は、(プログラムの他の多くの側面の中でも) メモリ割り当てのプロファイルも作成します。

あなたの質問に答えるには:なぜこの時点でretainCountがこのようになっているのかを知っているのはアップルだけです。

于 2011-03-08T14:03:31.983 に答える