2011-04-12 81 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