2011-01-31 53 views
35

兩者有什麼區別?如果我正在寫一個程序,我什麼時候會需要一個這樣的:C函數與Objective-C方法?

void aFunction() { 
    //do something 
} 

,當我需要這樣的:

-(void)aMethod { 
    //do something else 
} 

回答

77

實際上,一個Objective-C方法只是一個C函數,其中有兩個參數總是出現在開頭。

此:

-(void)aMethod; 

完全等價的:

void function(id self, SEL _cmd); 

Objective-C的消息是這樣的,這樣的:

[someObject aMethod]; 

完全等同於這個(幾乎 - - 這個答案的範圍之外有一個可變參數ABI問題):

objc_msgSend(someObject, @selector(aMethod)); 

objc_msgSend()找到合適的實施方法(通過查找它在someObject),然後,通過尾調用優化的神奇,跳到方法的執行當中,對所有意圖和目的,作品酷似C函數調用,看起來像這樣:

function(someObject, @selector(aMethod)); 

毫不誇張地說,Objective-C的最初實現爲不過是一個C預處理器。 任何東西你可以在Objective-C中做的可以改寫成直的C.

然而,這樣做會是一個完全痛苦的屁股,除了這樣做的難以置信的教育經驗,不值得你花時間。


通常,在使用直C語言處理對象和函數時,使用Objective-C方法。鑑於幾乎所有的Mac OS X和iOS都提供了Objective-C API--對於UI級別的編程入口點來說肯定是如此 - 那麼大部分時間你都會使用Obj-C。

即使在編寫相對獨立的模型級代碼時,通常也會使用Objective-C,因爲它提供了狀態/數據功能之間非常自然的粘合,這是面向對象編程的基本租戶。

9

在Objective-C的每個功能的對象進行操作,像

[myObject myFunction]

交流法具有如下形式:

return-type function-name(argument1, argument2, etc) {}

一個Objective-C 實例方法具有以下形式:

-(return-type)function-name:argument1 {}

或用於多參數函數

-(return-type)function-name:argument1 function-name:argument2 {}

我總是使用Objective-C的即使您仍然可以使用C型函數,也可以在Obj-C編程中使用這種方法。

我想在C相當於[myObject myMethod:arg]可能是myObject.myMethod(arg)

+6

其實在C中沒有方法,只是獨立函數;您編寫的最後一個「等效的C」語法是實例方法的* C++ *語法。 – 2011-01-31 01:25:47

+0

對我來說,方法和功能是一樣的東西。即語言可互換。一些編程語言確實有所區別,但是在所有方面都適合使用函數,反之亦然。 – aqua 2011-01-31 01:27:54

+4

@aqua:AFAIK,當你談論對象時你會談論方法(http://en.wikipedia.org/wiki/Method_%28computer_programming%29),否則你有一個函數或子例程。不過,我的基本觀點是,你寫的最後一個「等價的C」語法沒有意義,因爲在C中沒有對象(`結構`沒有實例方法)。相反,這是** C++ **中用於實例方法的語法。 – 2011-01-31 01:32:02

2

首先是一個獨立的功能。第二個是Objective-C類的實例方法。所以我想如果你真的在寫課程,你會需要第二個版本。