新しい配列にコピーしたいカスタムオブジェクト(NSObjectに基づく)のNSMutableArrayがあります。しかし、私はそれを深いコピーにしたいと思っています。
どうすればこれを行うことができますか?カスタムオブジェクトにNSCopyingプロトコルを実装する必要がありますか?
ありがとう
新しい配列にコピーしたいカスタムオブジェクト(NSObjectに基づく)のNSMutableArrayがあります。しかし、私はそれを深いコピーにしたいと思っています。
どうすればこれを行うことができますか?カスタムオブジェクトにNSCopyingプロトコルを実装する必要がありますか?
ありがとう
はい、カスタムクラスがNSCopying
プロトコルに準拠していることを示してから、copyWithZone:
メソッドを実装する必要があります。これにより、クラスをコピーできます。の実装でcopyWithZone:
は、内部のどれだけがディープコピーを必要とするかを決定する必要があります。
これで、配列のディープコピーを実行すると、新しい配列には、元のオブジェクトへの参照だけでなく、オブジェクトのコピーされたバージョンが含まれます。
配列の通常のコピーはディープコピーを行わないことに注意してください。ディープコピーを作成するには、次のようなものが必要です。
NSArray *deepCopyArray=[[NSArray alloc] initWithArray:someArray copyItems:YES];
配列のディープコピーは、すべての要素を手動で調べることで実行できます。これは、オブジェクトをさらに深くコピーする必要がある場合に必要です。
NSMutableArray *deepCopied = [NSMutableArray arrayWithCapacity:[array count]];
// assumes your objects know how to "deepCopy"
for (id object in array)
{
// if not ARC or GC:
[deepCopied addObject:[[object deepCopy] aurorelease]];
// if ARC or GC
[deepCopied addObject:[object deepCopy]];
}
さもないと:
NSArray *deepCopied = [[NSArray alloc] initWithArray:array copyItems:YES];
大量のディープコピーを作成する必要がある場合に役立つ可能性のあるカテゴリメソッドがここの回答に記載されています。