Autoreleaseがすぐに保持されるポイントは何ですか?
-
30-09-2019 - |
質問
私はいくつかのオープンソースコードを見て、著者が特定の方法で何かをした理由を理解しようとしています。
クラスはラッパーです 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
扱いにくいメモリを指します。しかし、 retain
と autorelease
プールが空になるまで保持数は1です。 foo
それでも有効なオブジェクトを指します。
所属していません StackOverflow