Howard Spear
Howard Spear

Reputation: 551

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

I want to allow deep copy of my class object and am trying to implement copyWithZone but the call to [super copyWithZone:zone] yields the error:

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

How should I create a deep copy of this class?

Upvotes: 4

Views: 5509

Answers (1)

rmaddy
rmaddy

Reputation: 318924

You should add the NSCopying protocol to your class's interface.

@interface MyCustomClass : NSObject <NSCopying>

Then the method should be:

- (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;
}

NSObject doesn't conform to the NSCopying protocol. This is why you can't call super copyWithZone:.

Edit: Based on Roger's comment, I have updated the first line of code in the copyWithZone: method. But based on other comments, the zone can safely be ignored.

Upvotes: 9

Related Questions