質問

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

クラスはラッパーです NSArray プッシュ、ポップなどでスタックデータ構造を作成します。

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

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

保持とは何ですか?

私の最初の反応は、これがメモリリークに関するアナライザー警告を妨げるだろうということでしたが、保持/自動化なしで分析しましたが、まだ警告はありませんでした。

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

だから私はここで保持/オートレリーズの使用を理解していません...

役に立ちましたか?

解決

仮定しましょう top このようになります:

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

それからこれを想像してください:

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

次のことが発生します。2番目の行は、保持カウントを0に減少させ、3行目にします foo 扱いにくいメモリを指します。しかし、 retainautorelease プールが空になるまで保持数は1です。 foo それでも有効なオブジェクトを指します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top