2011-03-18 49 views
0

我已經購買了Xcode 4以開始開發iOS應用程序。我來自C,C++的背景。 我已經從這裏輸入了示例: http://en.wikibooks.org/wiki/Objective-C_Programming/syntax 到一個XCode項目(命令行工具 - >基礎模板,不是我知道它是什麼意思,就是我讀的地方)。 我給文件命名爲:point.h,point.m,main.m未能在Xcode 4上編譯Objective-C

起初,我得到了3個錯誤。我通過將課程名稱從「Point」更改爲「MyClass」 ,但現在我得到以下警告: 找不到方法'+ new'(返回類型默認爲'id') 關於該行: MyClass *point = [MyClass new]

我也在調試器輸出部分沒有輸出。

任何想法如何解決這個問題?

+0

發佈您的一些代碼。例如,發佈MyClass的頭文件。它是NSObject的一個子類嗎? – 2011-03-18 22:22:15

+0

如果程序無法編譯,您將無法在調試器中獲得任何輸出。調試器只能用於正在運行的應用程序。 – dreamlax 2011-03-18 23:00:01

回答

2

好像你有一些問題...

我會說你忘了從NSObject繼承,因此該方法+new找不到。

@interface MyClass : NSObject 

@end 
1

好吧,讓我們從頭開始。 Read this

現在,「+新」是有意義的。它告訴你,你要求發送消息給CLASS「MyClass」。這與「MyClass」的實例非常不同。其他語言中的類消息被稱爲「靜態方法」或「類方法」。在ObjC中,類方法用+表示,實例方法用-表示。

最常見的分類方法是alloc。在ObjC中,您將此消息發送給該類以創建一個新實例並將其返回。一旦爲新實例分配了內存,就可以發送init消息給它。從此,你可以retainrelease它。我想你應該已經明白了。大多數消息旨在被髮送到類的實例,而不是類本身。

所以....

MyClass* c = [[MyClass alloc] init]; 
[c doStuff]; 
[c release]; 

首先,我們分配新的內存來保存的MyClass的對象。然後我們發送一個init消息以確保它的設置都正確。之後,我們發送doStuff消息到存儲在c變量中的MyClass的初始化實例。然後我們通過發送release消息來釋放內存。

關於保留/釋放的注意事項。

當我們分配時,保留計數從0變爲1.當我們釋放時,保留計數從1變爲0.這類似於其他語言中的一些「智能指針」。一旦保留計數達到0,對象就被釋放。所以,當釋放消息在這裏發送時,你應該能夠在你的MyClass dealloc塊(一個實例方法)中設置一個斷點。只要記住,當你指定init或dealloc塊時,總是把消息發送給super,以便你得到適當的清理。

編輯:

是的,我覺得作爲@macmade說,你應該從NSObject繼承。你可以從這個基類中得到各種真正有用的東西,比如new,alloc,init,release,retain,autorelease等等。原因是你的實例會生活在堆上,而不是棧上。在像Java或C#這樣的語言中,你可以透明地獲得這個統一的類型系統。既然這是ObjC,你需要選擇加入它。

如果你寧願管理你的Point像一個結構(看看內置的CGPoint),你也可以這樣做,但在這種情況下,你需要對它進行非常不同的管理。這將是堆棧內存,而不是堆內存。您可以通過查看諸如CGPoint或CGRect之類的源代碼來獲得差異的一個很好的例子。實際上,所有這些東西在Apple的The Objective-C Programming Language中都有很清楚的記載。

+2

調用類方法'new'與'alloc'和'init'非常相似...如果'new'方法沒有找到,'alloc'不會是... – Macmade 2011-03-18 22:44:46

+1

不應該是'MyClass * C'? – detunized 2011-03-18 22:49:50

+0

是的......靜態分配在ObjC中並不真正支持,即使他們有一些方法可以做到這一點:P – Macmade 2011-03-18 22:52:25