7

私はいくつかのオープンソースコードを見て、作者が特定の方法で何かをした理由を理解しようとしています。

このクラスは、NSArraypush、popなどのスタックデータ構造を作成するためのラッパーです。

1つのメソッドはtopObject、スタックの最上位のオブジェクトを返す方法であり、その実装は次のとおりです。

- (id)top {
    return [[[stack lastObject] retain] autorelease]; // stack is an instance of NSMutableArray
}

保持とそれに続く即時自動リリースとは何ですか?

私の最初の反応は、これによりアナライザーがメモリリークについて警告するのを防ぐことができるというものでしたが、保持/自動解放なしで分析しましたが、それでも警告はありませんでした。

ライフサイクルを見ると、オブジェクトが作成され、スタックにプッシュされて解放されるため、スタックがオブジェクトを所有します(基になる配列は追加時にオブジェクトを保持します)。

だから私はここで保持/自動解放の使用法を理解していません...

4

1 に答える 1

9

次のようになると仮定しましょうtop

- (id) top {
    return [stack lastObject];
}

次に、これを想像してください:

foo = [bar top];
[bar removeAllObjects];
// Do something with foo

次のようになります。2行目は保持カウントを0に落とし、3行目fooまでに割り当て解除されたメモリを指します。ただしretainautorelease保持カウントが1の場合、プールが空になるまで、3行目fooは有効なオブジェクトを指します。

于 2010-10-15T14:17:30.017 に答える