の Xcode ドキュメントでNSCopyObject
は、特別な考慮事項のセクションに次のように記載されています。
この機能は危険であり、正しく使用することは非常に困難です。
copyWithZone:
サブクラス化できるクラスの一部として使用すると、非常にエラーが発生しやすくなります。GC または Objective-C 2.0 を使用している場合、ゾーンは完全に無視されます。この機能は、Mac OS X 10.6 以降で非推奨になる可能性があります。
正しい使い方が難しいのはなぜですか?浅い (ビットごとの) コピーを実行します。オブジェクトはコピーまたは保持されません。ドキュメントはこれについてかなり明確です。
他の理由を見逃していない場合、オブジェクトの浅いコピーを実行するための推奨される代替手段は何ですか?
編集:
浅いコピーを実行する正当な理由があります。1 つの例: クラスには多くのインスタンス変数があり、そのほとんどはプリミティブ型 (integer、float) または保持サイクルを避けるために意図的に保持されていないオブジェクト (デリゲート) です。を使用した浅いコピーNSCopyObject
は、これらすべてを自己文書化された 1 行のコード行にコピーします。参照カウントが必要な残りの ivar は、個別に保持またはコピーできます。
これに代わる方法は、ポインター構文 ( newObject->ivar = ivar
) を使用して新しいオブジェクトに割り当てるか、潜在的に多数の引数 (コピーする ivar ごとに 1 つ) を持つ init メソッドを作成することです。後者は特に醜いと思いますが、ヘッダーに含めて世界に公開する必要はないと思います。