オブジェクトを複製するためのNSCopying
独自クラスのオブジェクトをまるっとコピーしたいシーンってまぁまぁあるじゃないですか。
そんな時はNSCopyingの出番です。 NSCopyingはプロトコルでこのプロトコルに準拠したクラスを作ればコピーできますよーという話です。 NSArrayとかNSDictionaryとかのヘッダファイル見るとわかりますが、こいつらもNSCopyingに準拠してるからコピーできるんですね。
じゃあそのNSCopyingに準拠するよってのをやってみましょう。
まずはNSCopying
の実装を確認してみます。
@protocol NSCopying - (id)copyWithZone:(NSZone *)zone; @end
はい、何のことはないですね。copyWithZone:
だけ実装しとけばなんとかなります。
copy
メソッドはcopyWithZone:
の戻り値を返すようなので、copyWithZone:
メソッド内で、正しく値をコピーする処理を書いておけばOKなのです。
ちなみにcopyWithZone:
を実装していないのにcopy
をコールすると例外がスローされます。
では本題の独自クラスで。今回はおすしクラスを作ってみました。
@interface Osushi : NSObject <NSCopying> @property (nonatomic, strong) NSString *neta; @property (nonatomic, strong) BOOL containsWasabi; @end @implementation Osushi - (id)copyWithZone:(NSZone *)zone { Osushi *newInstance = [[[self class] allocWithZone:zone] init]; if (newInstance) { newInstance.neta = self.neta; newInstance.containsWasabi = self.containsWasabi; } return newInstance; } @end
こんな感じです。
allocWithZone:
は以前はリソース効率アップのために存在していたようですが、もはやあんまし使われていないようなので、普通にalloc
でも大丈夫だと思います。
こんな感じであとは普通にcopy
すると幸せになれます。