【问题标题】:Sending messages to objects?向对象发送消息?
【发布时间】:2011-04-12 23:45:59
【问题描述】:

我之前已经成功做过很多次了,但是这次就不行了。

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

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

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

【问题讨论】:

    标签: objective-c cocoa object message


    【解决方案1】:

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

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

    【讨论】:

    • 并且由于-draw(或+draw)没有声明参数,OP应该写[Images draw]代替(没有nil参数)。
    【解决方案2】:

    我认为有必要回顾一下面向对象编程的一些基本概念;即类与对象或实例之间的区别。

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

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

    一个典型的例子是水果——例如苹果。一个虚构的 Apple 类将代表一般意义上的所有苹果,并模拟颜色和大小等属性以及洗和吃等动作。一个实例将代表一个单一的物理苹果——Granny Smith 或 Pippin 或任何品种。

    正如一般意义上的洗苹果或吃苹果没有意义(苹果的概念,而不是团块),通常告诉班级该做什么也没有意义。您告诉对象(单个苹果)该做什么。

    您在上面提供的代码定义了Images 类。 -(void)draw前面的“-”表示draw方法只针对特定对象存在。它是典型的 OO 用语中的实例方法。

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

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

    【讨论】:

    • 为了澄清一点,我正在制作一个图像编辑程序。我需要Images 来做到这一点。我知道我显然不是一个很好的程序员,但是我的兄弟们要求我这样做,以便他们可以为我制作的不同应用程序制作自己的图像(他们不喜欢 Gimp,而且 Photoshop 对他们来说太贵了)。非常感谢这个答案。
    • 我不会把不好和缺乏经验混为一谈!作为图像编辑器接受挑战的荣誉不是一件容易的事情。
    • 谢谢。到目前为止,我只做过简单的应用程序(例如使用图像而不是实际滚动 3D 骰子的骰子滚轮)。至于“复习”,确实帮了大忙。
    猜你喜欢
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2010-12-07
    • 2011-09-14
    • 1970-01-01
    相关资源
    最近更新 更多