向对象发送消息?

时间:2011-04-12 23:45:59

标签: objective-c cocoa object message

我之前已多次成功完成此操作,但这次它无法正常工作。

我的.h文件中的代码:

@interface Images : NSView {

}

- (void) draw;

@end

.m文件(另一个对象):

- (IBAction) go: (id) sender; {
[Images draw:nil];

}

当我尝试编译时,它会说:

'*' may not respond to '*

Images may not respond to '+draw'

这让我很困惑。这应该不起作用吗?

请注意:是的,我已经看到了有关消息的其他问题,但这些答案对我来说都没有任何帮助。读完之后,我更加困惑。

2 个答案:

答案 0 :(得分:3)

您的draw方法是一种实例方法:它只能在Images类的实例上调用。在您的go:方法中,您尝试将其称为类方法 - 如果这是您想要的,请将其更改为:

@interface Images : NSView
+ (void)draw;
@end

答案 1 :(得分:1)

我认为对面向对象编程的一些基本概念的评论是有序的;即类和对象或实例之间的区别。

一般来说,类是一组数据和作用于它的函数。类定义用于访问和操作逻辑分组在一起的数据的接口,并用作创建对象或实例的蓝图。见http://en.wikipedia.org/wiki/Class_(computer_programming

类(对象)的实例是您在面向对象程序中操作的典型事物,它们是从“蓝图”类创建的,并遵循类指定的行为。

一个典型的例子是水果 - 例如苹果。假想的Apple类将代表一般意义上的所有苹果,并且会模拟诸如颜色和​​大小以及诸如洗涤和进食等动作之类的属性。一个实例将代表一个单一的物理苹果 - 格兰尼史密斯或皮平或任何种类。

就像一般意义上的苹果洗涤或吃苹果一样没有意义(苹果的概念,而不是聚集),通常告诉班级该怎么做是没有意义的。你告诉对象(个别苹果)该怎么做。

上面的代码定义了图像类。 - (void)draw前面的“ - ”表示draw方法仅存在于特定对象。它是典型OO用语中的实例方法。

当然,在Obj-C中,也可以在不需要对象的情况下向类发送消息。这在方法名称前面用“+”表示,正如其他答案所示。这称为静态方法,通常用于控制该特定类的所有对象的某些共享行为或方面。

您的代码的问题在于您声明 - (void)绘制为实例方法但将其作为静态方法调用。你想做什么事情取决于你,而且很难从你的代码中确定Images类的意图是什么。