2011-04-12 105 views
0

以前我已经成功完成过很多次了,但是这一次它不起作用。将消息发送给对象?

在我的.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'

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

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

回答

3

您的draw方法是一种实例方法:它只能在Images类的实例上调用。在你go:方法你要调用它作为一个类的方法,如果这是你想要的东西,将其更改为:

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

谢谢。它完美的作品。我不明白我是如何错过的。 – Justin 2011-04-12 23:53:23

+2

由于'-draw'(或'+ draw')没有声明参数,所以OP应该写'[Images draw]'而不是'nil'参数。 – 2011-04-12 23:54:17

+0

@Bavarious斑点。 – 2011-04-12 23:56:16

1

我想到一些面向对象编程的基本概念的审查为了;即类和对象或实例之间的差异。

从一般意义上讲,类是数据的集合和作用于它的函数。一个类定义了用于访问和操作逻辑分组在一起的数据的接口,并且用作创建对象或实例的蓝图。请参阅http://en.wikipedia.org/wiki/Class_(computer_programming

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

一个典型的例子就是一个水果苹果。一个虚构的苹果课程将代表所有苹果的一般意义,并将模拟属性,如颜色和大小以及洗涤和吃饭等行为。一个实例将代表一个单一的物理苹果 - 一个格兰尼史密斯或皮平或任何其他品种。

就像在苹果这个词的一般含义(苹果的概念,而不是聚集)中清洗或吃苹果没有任何意义,通常讲讲课堂该做什么是没有意义的。你告诉对象(单个苹果)要做什么。

上面显示的代码定义了类图像。 - (void)绘制前的“ - ”表示绘制方法仅对特定对象存在。这是典型的OO说法中的实例方法。

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

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

+0

道歉,如果你已经知道这一点。 – sbooth 2011-04-13 00:10:52

+0

为了清楚这一点,我正在制作一个图像编辑程序。我需要'Images'来做到这一点。我知道我显然不是一个很好的程序员,但是我的兄弟们要求我这样做,以便他们可以为我制作的其他应用程序制作自己的图像(他们不喜欢Gimp,而Photoshop对他们来说是昂贵的)。非常感谢这个答案。 – Justin 2011-04-13 00:14:31

+0

我不会把经验不足与糟糕混为一谈!作为图像编辑器接受挑战的荣誉并不是一件容易的事。 – sbooth 2011-04-13 00:29:48