2014-07-23 26 views
1

假设在某些类接口中,我声明一个属性为“copy”属性,该属性是另一个类的实例,其不是实现“-copyWithZone”。例如说不应该编译器警告我该类不响应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; 

什么情况是,在运行时我得到这样一个异常“ - [狗copyWithZone:]:无法识别的选择......”我完全已了解。

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

+0

它会,如果你宣布@接口狗:NSObject 。 – gnasher729

回答

0

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

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

1

@property修饰符用于指定(或修改)实例变量的行为。 Objective-C是一种动态语言,因此它可以在运行时评估大部分类型。复制修饰符不仅仅是向对象发送复制消息,并且因为消息在运行时分派,所以在消息到达不响应其选择器的消息对象之前,您将不会收到任何类型的错误。 只有当你指定你想你的类由符合NSCopying协议,你会得到从编译器警告:

@interface MyClass : Superclass <NSCopying> 

比你不执行所需的方法。 希望它有帮助。

+0

感谢您的回复。我假设我要求编译器合成myDog的setter(感谢@Rob指出了这一点)。因此,编译器(道德上)生成一个代码,将“复制”(或“copyWithZone:”)消息发送给myDog。我认为给出“可能不响应”警告可能是一个好主意,我只是想知道如果可能有理由_不发布此警告,但我没有看到它们。 – brian0

相关问题