2012-02-20 12 views
2

初めてNSCopyingを実装しようとすると、私はNSZoneのsubletiesについての質問があります。この例では同じNSZoneを2回使用できますか?

- (id)copyWithZone:(NSZone *)zone { 
    MyClass *copy = [[[self class] allocWithZone:zone] init]; 

    copy.array = [[self.array mutableCopyWithZone:zone] autorelease]; 

    return copy; 
} 

を、私は二回NSZoneを使用しています:最初のオブジェクトを割り当てるし、再度割り当てるために配列のコピーこれは合法ですか?それは必要ですか?私はmutableCopyを単純に行うことができます。また、-initWithArray:copyItems:を代わりに使用する方法も検討しています。

どのような方法が最適ですか? 「結果の配列のオブジェクトを浅いか深いコピーにする必要がありますか?」という質問に自由にどうぞ。私の鍵は、NSZoneを2回使用するのが安全かどうかです。

答えて

3

同じゾーンから複数のオブジェクトを作成することは、ゾーンが発明されたものとまったく同じです。そのアイデアは、ゾーンを作成し、そのゾーンから1つまたは複数のオブジェクト(および関連するオブジェクトを作成する可能性があります)を作成すると、そのゾーンを破棄して、その中のすべてのオブジェクトを破棄することができます。

問題は、参照カウントの概念、つまり所有権とはあまり互換性がないということです。あなたがまだ所有している(つまり、まだ使用できると思われる)オブジェクトが1つ以上あるゾーンを吹き飛ばすと、物事が壊れます。ゾーンを破棄するまでにそれらのオブジェクトがすべての所有者によって解放された場合、それらはすでに一度に1つずつ割り当て解除されているため、ゾーンは何も実行しないので不要です。

したがって、zones have been killed offのように、文法的に一貫性を保つためにやっているように思うかもしれませんが、実行時に何が起こるかに大きな違いはありません。

+0

こんにちは、あなたが正しいことは間違いありません、ありがとうございます。これがNSCopyingにどのような影響を与えるかを詳しく教えてください。私は以前よりももっと混乱しています。 NSCopyingに準拠する理由は、[aDictionary setObject:x forKey:myNSCopyingObject]と言うことができるためです。あなたがNSZoneについて何を言っているのかは、プロトコルに正しく従う方法に疑問を投げかけます。明らかに私はアップルのテンプレートから始めました。彼らは明らかに更新していません。 – SG1

+0

@ SG1:元のオブジェクトを作成する場合と同じです。ゾーンは少なくとも公称で使用することができます(ゾーンは実際には何もしません)。または、ゾーンが存在しないようにして、実装内で 'alloc' /' copy'/'mutableCopy'を使用してください。あなたの選択。 –

関連する問題