NSMutableArray 内に保持するオブジェクトのプールがあるため、他のオブジェクトが新しいオブジェクトを作成する代わりにそれらを参照したい場合は、既に作成したオブジェクトへの参照を与えるだけです。
以前は、これらのオブジェクトの保持/解放呼び出しを監視し、保持カウントが 1 (私の配列のみ) に達したら、それらを配列から削除していました。ただし、保持/解放を監視できないため、ARCでこれを行うのに苦労しています。これを行うにはどうすればよいですか?
NSMutableArray 内に保持するオブジェクトのプールがあるため、他のオブジェクトが新しいオブジェクトを作成する代わりにそれらを参照したい場合は、既に作成したオブジェクトへの参照を与えるだけです。
以前は、これらのオブジェクトの保持/解放呼び出しを監視し、保持カウントが 1 (私の配列のみ) に達したら、それらを配列から削除していました。ただし、保持/解放を監視できないため、ARCでこれを行うのに苦労しています。これを行うにはどうすればよいですか?
release/retains 呼び出しに基づいてオブジェクトを管理する方法を作成するのは危険です。もし Apple がたまたまその働き方を変えたら、あなたはうんざりだ。どうやら、ARC を使い始めたときに、それが起こったようです。次の 2 つのことがあります。
NSMutableArray
1)オブジェクトが他のオブジェクトによって使用されているかどうかにかかわらず、オブジェクトを独立して内部に保持したい。__weak
その場合、そのオブジェクトへの参照を作成するだけで、そのようにして、内にあるオブジェクトNSMutableArray
が生き続けます。
2) オブジェクトへの参照がなくなったら、NSMutableArray
. オブジェクトに追加しNSMutableArray
ます__weak
。1strong
つがリリースされると、アレイ内の1つもリリースされますが、このアプローチは危険だと思うのであまり好きではありません. このオプションを使用する場合は、これを使用してオブジェクトを保存します。
NSValue *weakObject = [NSValue valueWithNonretainedObject:anObject];
[array addObject:weakObject];
最後に、その特定のファイルから ARC を削除するだけで、監視を維持できます。
まず、人間向けの単純なコードを作成する必要があります。
これが重大なボトルネックであることが (計測器またはその他の手段によって) 証明されるまで、このようなパフォーマンスの問題について心配する必要はありません。
とはいえ、特定のオブジェクトの作成には非常にコストがかかる可能性があるため、特定のオブジェクトのキャッシュを保持すること自体は悪い考えではありません。ただし、非 ARC コードであっても、参照カウントに依存するべきではありません。Appleのドキュメントはこれについて非常に明確です。
ジャッキーが指摘したように、代替案は弱い参照です。残念ながら、参照を標準コレクションに入れることはできませんweak
(ただし、皮肉なことに、それらを C++ コレクションに入れることはでき、それらは正しく管理されます)。
ただし、弱参照を保持する単純なラッパー クラスを作成できます。
@interface WeakWrapper : NSObject
@property (readonly) id object;
- (id)initWithObject:(id)object;
@end
@implementation WeakWrapper {
__weak id _object;
}
- (id)object {
return _object;
}
- (id)initWithObject:(id)object {
if (self = [super init]) {
_object = object;
}
return self;
}
@end
次に、これらのオブジェクトをコレクション内に配置してから...
WeakWrapper *wrapper = // get the object from the collection
id object = wrapper.object;
if (nil == object) {
// You know the object that was being referenced no longer exists
// so this wrapper can be removed from the collection and destroyed.
}
私はそのような複雑なシステムを気にしません。強いプロパティと弱いプロパティだけを操作し、パフォーマンスを推測しようとしないでください。自分でメモリ管理システムを構築しようとしていますが、ARC ではほとんど意味がありません。オブジェクトの作成と削除は、通常、objective-c アプリのパフォーマンスのごく一部です。何年もインストゥルメントを使ってパフォーマンスを監視してきたので、もうこの部分について心配する必要はありません。