好吧,讓我們從頭開始。 Read this。
現在,「+新」是有意義的。它告訴你,你要求發送消息給CLASS「MyClass」。這與「MyClass」的實例非常不同。其他語言中的類消息被稱爲「靜態方法」或「類方法」。在ObjC中,類方法用+
表示,實例方法用-
表示。
最常見的分類方法是alloc
。在ObjC中,您將此消息發送給該類以創建一個新實例並將其返回。一旦爲新實例分配了內存,就可以發送init
消息給它。從此,你可以retain
或release
它。我想你應該已經明白了。大多數消息旨在被髮送到類的實例,而不是類本身。
所以....
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中都有很清楚的記載。
來源
2011-03-18 22:40:04
slf
發佈您的一些代碼。例如,發佈MyClass的頭文件。它是NSObject的一個子類嗎? – 2011-03-18 22:22:15
如果程序無法編譯,您將無法在調試器中獲得任何輸出。調試器只能用於正在運行的應用程序。 – dreamlax 2011-03-18 23:00:01