2012-09-13 48 views
3

在做的Objective-C,我必須寫出來的功能,如:的Objective-C C類型及功能

- (int) someFunction: (int) a someParam: (int) b; 

或者,我可以使用常規的C風格:

void someFunction(int a, int b); 

如果我能做到C風格,在Objective-C風格中做它有什麼好處?

回答

6

可以使用常規的C函數,如果你喜歡,因爲目標C僅僅是一個超集C.

的需要,如果你想使用Objective C的特性,如類使用目的C語法,消息,繼承等等,當然還有使用Cocoa/CocoaTouch SDK。

您可以在您的文件中混合使用Objective C和C代碼,並將Objective C方法調用爲純C函數。您還可以通過直接訪問Objective C運行時層(例如,使用objc_msgSend函數)從純C函數調用Obective C方法。

7

這不是一個Objective-C函數,它是一種方法。它有權訪問實例的變量和其他方法。這兩個不相同。在大多數情況下,您應該使用Objective-C方法。你爲什麼要使用C函數?你想做什麼?

+0

我被int main(int argc,char * argv [])聲明爲C風格所困惑,但在讀完sergio的迴應之後,我忘記了C不能做類(我去了C++ - > C#now到Objective-C),所以Objective-C聲明類的方式是@interface和時髦的方法名稱分割。謝謝,你們都清楚了。 –

+0

如果您瞭解C++,您可能也會對以下事實感興趣:通過將源文件命名爲「.mm」擴展名而不是「.m」擴展名,它們將編譯爲Objective-C++。您可以在C++之上而不是在C之上獲得Objective-C語法。並且使用最新版本的編譯器,您還可以獲得大量C++ 11功能(不確定是否全部獲得了,因爲我不是C++ 11的大師)。 –

1

第一個聲明是一個方法聲明第二個聲明是一個函數。他們是兩件完全無關的事情。兩者都在Objective-C中被接受。但方法聲明只能發生在@interface@end之間。並且函數聲明不能​​發生在@interface@end

0

兩者之間的區別在於泛型方法和實例方法之間的區別。第一個例子是一個通用的方法。它可以從任何地方調用(只要編譯器可以找到它),並且不需要任何對象的實例。如果你已經使用了像CGPointMake(x,y)這樣的方法,它們被設置爲通用(C風格)方法。

someFunction(4,5); 

第二種類型是實例方法。它僅在一個類中定義,並且 - 在開始處意味着您必須擁有該類的實例才能調用該方法。所以

Foo *myFoo = [[Foo alloc] init]; 
[myFoo someFunction:4 someParam:5]; 

我傾向於使用簡單的實用程序方法,不一定屬於一個類或其他,如數學或點操作方法的第一種風格。你的大多數方法可能應該是實例方法,但這是一個更長的答案(面向對象的設計)。