1. ホーム
  2. objective-c

[解決済み] Objective-Cでオブジェクトをコピーする方法

2022-09-20 02:20:51

質問

それ自身のオブジェクトを持つカスタムオブジェクトをディープコピーする必要があります。NSCopying を継承する方法と NSCopyObject を使用する方法について、いろいろと読んでみましたが、少し混乱しています。

どのように解決するのですか?

参照型ではいつもそうですが、"copy" の概念が2つ存在します。私はあなたがそれらを知っていると確信していますが、完全性のために。

  1. ビット単位のコピー。これでは、単にメモリをビット単位でコピーしているだけです。これは、NSCopyObjectが行うことです。ほぼ常に、それはあなたが望むものではありません。オブジェクトは内部状態や他のオブジェクトなどを持っていて、そのデータへの参照を保持しているのは自分だけだという仮定をすることがよくあります。ビット単位のコピーではこの仮定が崩れます。
  2. 深い、論理的なコピー。Objective C のマニュアルでは、このようなオブジェクトをオリジナルから機能的に独立したオブジェクトと呼んでいます。このようなインテリジェントなコピーを作成するメカニズムはクラスによって異なるため、オブジェクト自体にその実行を依頼します。これがNSCopyingプロトコルです。

あなたは後者を望んでいます。もしこれがあなた自身のオブジェクトの1つであるなら、単にNSCopyingプロトコルを採用し、-(id)copyWithZone:(NSZone *)zoneを実装すればよいのです。どのようなことをしてもかまいませんが、自分自身の本当のコピーを作って、それを返すというのがアイデアです。自分のすべてのフィールドでcopyWithZoneを呼び出して、深いコピーを作るのです。簡単な例を挙げますと

@interface YourClass : NSObject <NSCopying> 
{
   SomeOtherObject *obj;
}

// In the implementation
-(id)copyWithZone:(NSZone *)zone
{
  // We'll ignore the zone for now
  YourClass *another = [[YourClass alloc] init];
  another.obj = [obj copyWithZone: zone];

  return another;
}