0

即使我的@interface 部分为空白,我的代码也会编译并返回预期结果,我不知道为什么。正确的代码:

@interface XYPoint : NSObject
-(void) setX: (int) x;
-(void) setY: (int) y;
-(int) valueX;
-(int) valueY;

@end

当@interface 看起来像这样时,代码仍然可以编译:

@interface XYPoint : NSObject

@end

为什么当我忽略在类部分的@interface 部分声明任何方法时,代码仍然有效?

完整的代码块位于http://pastebin.com/J40gJbbj

4

2 回答 2

4

当您从 .h 文件中删除声明时,您的代码将编译,因为没有其他类必须使用这些方法。

如果方法打算由其他类使用,则仅应在 .h 文件中声明方法。实际类的实现根本不需要它们。

听起来您需要返回许多 .h 文件并删除所有不必要的方法声明。

.h 中应该出现的唯一内容是供其他类使用的内容。这包括实例变量(很少有公共实例变量)、属性和方法。您添加到该@interface行的许多协议也应移至 .m 文件。您的所有私有 ivars、属性和协议引用都应添加到 .m 文件中。

于 2013-03-15T01:54:31.893 回答
1

因为编译器足够聪明,可以在您的实现中找到它们,这就是它编译的原因。

它不会崩溃的原因是在 Objective-C 技术上,您可以向任何对象发送任何消息,它可能不会响应它。这就是运行时的力量。

在objective-c中,虽然我们有类型,但它们不是必需的。您可以像这样使用简单的鸭子类型:

id obj = ...

if ( [myObj respondsToSelector:@selector(valueX)] )
{
  // myXYPoint talks like a XYPoint
   int aXval = [(XYPoint*)myobj valueX];

  //or if you don't like the cast,
  aXval = [myObj performSelector:@selector(valueX)];

}
于 2013-03-15T01:19:28.443 回答