オブジェクトのコピー
オブジェクトをコピーすると、元のオリジナルのオブジェクトと同じクラスおよびプロパティを持つ新しいオブジェクトを作成します。オブジェクトが含むデータの独自のバージョンが必要な場合に、オブジェクトをコピーして下さい。他の場所から、アプリ内からオブジェクトを受け取ったが、それをコピーしない場合は、カプセル化された内容を変更する場合があり、その所有者(そしておそらく他の人) とオブジェクトを共有します。サブクラスを作成している場合、それが可能な他の人があなたのクラスのインスタンスをコピーできるようにすることを検討してください。一般的に、オブジェクトはそれが値オブジェクトである場合"コピー可能" でなければならず、オブジェクトの主な目的は、いくつかのデータをカプセル化することです。
オブジェクトコピーのための要件
そのクラスが NSCopying プロトコルを採用し、その一つのメソッド、copyWithZone: を実装する場合、オブジェクトはコピーすることができます。クラスが mutable と immutable のバリアントがある場合は、mutable なクラスは(NSCopying の代わりに)NSMutableCopying プロトコルを採用し、mutableCopyWithZone: を実装する必要があり、そのコピーされたオブジェクトが mutable な状態のままのことを確認します。それに copy または mutableCopy メッセージを送信することで、オブジェクトの複製を作ります。これらのメッセージは、適切な NSCopying または NSMutableCopying メソッドの呼び出しにつながります。
オブジェクトのコピーは浅いか深い(shallow or deep)であり、浅いのと深いコピーのアプローチは両方とも、直接スカラープロパティを複製しますが、それらがポインタ参照、特にオブジェクトへの参照を、(例えば、NSString *str) 処理する方法が異なります。深いコピーは、参照されたオブジェクトを複製しますが、浅いコピーは、それらのオブジェクトへの参照のみを複製します。そのため、オブジェクト A がオブジェクト B に浅いコピーされた場合、オブジェクト B は、オブジェクト A が参照している同じインスタンス変数(またはプロパティ)を参照します。オブジェクトの深いコピーは、特に値オブジェクトで、浅いコピーより好まれます。
メモリ管理への影響
オブジェクトの作成と同様に、オブジェクトのコピーは1の保持カウントを持つオブジェクトを返します。メモリ管理コードでは、オブジェクトをコピーしているクライアントはコピーされたオブジェクトを解放する責任があります。オブジェクトをコピーすることは、オブジェクトの所有権を表す両方でオブジェクトを保持する目的と類似しています。しかし、保持されたオブジェクトがオリジナルのオブジェクトの所有者とオブジェクトを保持しているクライアント間で共有されている間、コピーされたオブジェクトは、自由に変化できる新しい所有者に排他的に属しています。
前提条件の記事
関連記事
既出の議論
次の章
前の章