不应该编译器警告我类没有响应copyWithZone?

时间:2014-07-23 10:05:14

标签: objective-c

假设在某些类接口中我使用" copy"声明了一个属性。属性是实现的另一个类的实例" -copyWithZone"。比如说

@interface Dog: NSObject
@property (assign) int i;
@end

@interface Pets: NSObject
@property (copy) Dog *myDog;
@end

然后我在某处

Pets *myPets = [[Pets alloc] init];
Dog *uglyDog = [[Dog alloc] init];
myPets.myDog = uglyDog;

在运行时我会得到一个例外" - [Dog copyWithZone:]:无法识别的选择器......"我完全没有理解。

但是编译器不应该警告我这个吗? (它没有)。

2 个答案:

答案 0 :(得分:1)

@property修饰符用于指定(或修改)实例变量的行为。 Objective-C是一种动态语言,因此它在运行时评估大多数类型。复制修饰符不是向您的对象发送复制消息,而是因为在运行时调度消息,在消息到达不响应其选择器的消息对象之前,您不会收到任何类型的错误。 只有当您指定希望您的类符合NSCopying协议时,您才会收到编译器的警告:

 @interface MyClass : Superclass <NSCopying> 

并且没有实现所需的方法。 希望它有所帮助。

答案 1 :(得分:0)

编译器应该能够在合成复制访问器的情况下解决这个问题。我会打开雷达,要求在那里发出警告。

请务必注意,警告应仅适用于引用非NSCopying类的自动合成副本访问器。如果您自己覆盖访问者,编译器不应该发出警告。我有很多类copy属性不符合NSCopying;我只是在setter中实现了复制语义。在这种情况下,copy是调用者的文档,而不是编译器的指令。