NSCopying プロトコルリファレンス 翻訳元
このページの最終更新:2010-02-06
ADCの最終更新:2006-05-23
ADCの最終更新:2006-05-23
準拠しているクラス | 様々なCocoaのクラス |
フレームワーク | /System/Library/Frameworks/Foundation.framework |
使用可能な環境 | Mac OS X v10.0以降 |
コンパニオンガイド | Memory Management Programming Guide for Cocoa |
宣言ファイル | NSObject.h |
サンプルコード | CoreRecipes GeekGameBoard Sketch+Accessibility Sketch-112 SourceView |
概観(Overview)
NSCopyingプロトコルは、実用的なオブジェクトの複製の為のメソッドを宣言しています。正確には「複製」の意味はクラスによって異なりますが、複製されたオブジェクトは作られた時に元のオブジェクトと全く同じ値を持ち、独立した有効なオブジェクトでなければなりません。NSCopyingプロトコルによって生成された複製は、暗黙のうちに送信者に保持され、送信者はそれを解放する責任があります。
NSCopyingプロトコルではcopyWithZone:の一つのメソッドを宣言していますが、通常複製のときはコンビニエンスメソッドであるcopy?メソッドを呼び出します。copy?メソッドはNSObjectを継承する全てのオブジェクトで定義され、単純にcopyWithZone:メソッドをデフォルトゾーンで呼び出します。
このプロトコルを実装する方法には以下のような選択肢があります。
NSCopyingプロトコルではcopyWithZone:の一つのメソッドを宣言していますが、通常複製のときはコンビニエンスメソッドであるcopy?メソッドを呼び出します。copy?メソッドはNSObjectを継承する全てのオブジェクトで定義され、単純にcopyWithZone:メソッドをデフォルトゾーンで呼び出します。
このプロトコルを実装する方法には以下のような選択肢があります。
- copyWithZone:メソッドを継承していないクラスでNSCopyingをalloc?メソッドとinit...メソッドを使って実装します。
- NSCopyingの動作を継承しているときにはスーパークラスのcopyWithZone:メソッドを呼び出すことで実装します。スーパークラスの実装でNSCopyObject関数を使っている可能性がある場合、ポインタのインスタンス変数が保持されたオブジェクトに割り当てられていることを明確にしてください。
- クラスやコンテンツが不変であるときには、新しく複製を作る代わりに、オリジナルのオブジェクトを保持することによってNSCopyingを実装します。
スーパークラスからNSCopyingを継承しているサブクラスが追加のインスタンス変数を宣言している場合、サブクラスは自信のインスタンス変数を適切に操作する為にcopyWithZone:メソッドをオーバーライドする必要があります。その場合、スーパークラスの実装を最初に呼び出してください。
このクラスでできること(Tasks)
複製(Copying)
- copyWithZone: required method
インスタンスメソッド
copyWithZone:
オブジェクトを複製して新しいインスタンスを返します。
- (id)copyWithZone:(NSZone *)zone
パラメータ
- zone
- 新しいインスタンスを確保するメモリ領域を識別するゾーンです。ゾーンがNULLであれば、新たなインスタンスはNSDefaultZone関数の戻り値であるデフォルトのゾーンに確保されます。
解説
- 返されたオブジェクトは呼び出し元によって保持され、呼び出し元はオブジェクトを解放する責任があります。「不変対可変」の考察を受信側に当てはめれば、複製は不変オブジェクトです。ただし、オブジェクトの正確な本質はクラスが決定します。
使用可能な条件
- Mac OS X v10.0以降
関連項目
宣言ファイル
- NSObject.h