おすしたべたい

おすしがたくさん食べられるようにがんばるブログ

オブジェクトを複製するための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すると幸せになれます。