假设在某些类接口中我使用" 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:]:无法识别的选择器......"我完全没有理解。
但是编译器不应该警告我这个吗? (它没有)。
答案 0 :(得分:1)
@property修饰符用于指定(或修改)实例变量的行为。 Objective-C是一种动态语言,因此它在运行时评估大多数类型。复制修饰符不是向您的对象发送复制消息,而是因为在运行时调度消息,在消息到达不响应其选择器的消息对象之前,您不会收到任何类型的错误。 只有当您指定希望您的类符合NSCopying协议时,您才会收到编译器的警告:
@interface MyClass : Superclass <NSCopying>
并且没有实现所需的方法。 希望它有所帮助。
答案 1 :(得分:0)
编译器应该能够在合成复制访问器的情况下解决这个问题。我会打开雷达,要求在那里发出警告。
请务必注意,警告应仅适用于引用非NSCopying类的自动合成副本访问器。如果您自己覆盖访问者,编译器不应该发出警告。我有很多类copy
属性不符合NSCopying
;我只是在setter中实现了复制语义。在这种情况下,copy
是调用者的文档,而不是编译器的指令。