4

クラス オブジェクトのディープ コピーを許可したいので、copyWithZone を実装しようとしていますが、呼び出し[super copyWithZone:zone]でエラーが発生します。

error: no visible @interface for 'NSObject' declares the selector 'copyWithZone:'

@interface MyCustomClass : NSObject

@end

@implementation MyCustomClass

- (id)copyWithZone:(NSZone *)zone
{
    // The following produces an error
    MyCustomClass *result = [super copyWithZone:zone];

    // copying data
    return result;
}
@end

このクラスのディープ コピーを作成するにはどうすればよいですか?

4

1 に答える 1

9

NSCopyingクラスのインターフェースにプロトコルを追加する必要があります。

@interface MyCustomClass : NSObject <NSCopying>

次に、メソッドは次のようになります。

- (id)copyWithZone:(NSZone *)zone {
    MyCustomClass *result = [[[self class] allocWithZone:zone] init];

    // If your class has any properties then do
    result.someProperty = self.someProperty;

    return result;
}

NSObjectNSCopyingプロトコルに準拠していません。これがあなたが電話できない理由ですsuper copyWithZone:

編集: Roger のコメントに基づいて、copyWithZone:メソッドのコードの最初の行を更新しました。しかし、他のコメントに基づいて、ゾーンは安全に無視できます。

于 2012-11-29T00:27:39.263 に答える