2011-01-31 9 views
35

2つの違いは何ですか?C関数対Objective-C法?

void aFunction() { 
    //do something 
} 

と私は、この必要がありますとき:Objective-Cで

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

答えて

77

実際、Objective-Cメソッドは、先頭に常に2つの引数が存在する単なるC関数です。

は、この:

-(void)aMethod; 

はこれにまったく同じです:

void function(id self, SEL _cmd); 

のObjective-Cのメッセージングは​​、このようなものである:ほとんど(

[someObject aMethod]; 

はこれにまったく同じです - - この回答の範囲を超えて、可変的な議論のABI問題があります):

objc_msgSend(someObject, @selector(aMethod)); 

objc_msgSend()(someObject上でそれを見ることによって)メソッドの適切な実装を見つけ、その後、末尾呼び出しの最適化の魔法を通じて、すべての意図や目的のための方法の実装にジャンプ

function(someObject, @selector(aMethod)); 

文字通り、Objective-Cのは、もともとCプリプロセッサが、何として実装されました:、まさにこのように見えるCの関数呼び出しのように動作します。 何でも Objective-CでできることはまっすぐなCとして書き直すことができます。

しかし、これを行うことは、お尻の完全な痛みであり、そうすることの信じられないほどの教育経験を超えてあなたの時間の価値はありません。


一般的に、Objective-Cメソッドは、オブジェクトと話すときに使用し、ストレートC goopで作業するときに機能します。ほとんどすべてのMac OS XとiOSがObjective-C APIを提供していることを考えると、UIレベルのプログラミング・エントリー・ポイントのためにはまったくそうだ。だから、ほとんどの場合Obj-Cを使う。

比較的独立した独自のモデルレベルコードを書くときでも、Objective-Cは、オブジェクト指向プログラミングの基本テナントである状態/データ&の機能の間に非常に自然な接着剤を提供するためです。

+0

非常に簡潔で便利です。元のC++は単なるプリプロセッサであったことを思い出します。 – AlanObject

9

を各関数は次のように、オブジェクト上で動作し、私はプログラムを書いている場合は、とき、私はこれが必要になります

[myObject myFunction]

AC法の形式は:

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

のObjective-C インスタンス方法の形式を有する。

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

または多引数関数の私は常に客観-Cを使用

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

obj-Cプログラミングでは、Cスタイルのメソッドを使用することができます。

私は[myObject myMethod:arg]とCの等価はmyObject.myMethod(arg)

+6

実際にC言語では、ただのフリースタンディング関数しか存在しません。あなたが書いた最後の "同等のC"構文は、インスタンスメソッドの* C++ *構文です。 –

+0

私にとって、メソッドと関数は同じものです。言語で交換可能である。いくつかのプログラミング言語では区別がありますが、全面的には、メソッドが適切な場合は関数を使用する人もいれば、その逆もあります。 – aqua

+4

@aqua:AFAIK、オブジェクトについて話しているときにメソッドについて話をします(http://en.wikipedia.org/wiki/Method_%28computer_programming%29)。そうでなければ、関数またはサブルーチンがあります。それでも、私の根本的なポイントは、あなたが書いた最後の "等価なC"構文は意味がありません。なぜなら、Cではオブジェクトがないからです( 'struct'はインスタンスメソッドを持っていません)。その代わりに、** C++ **で使用される構文がインスタンスメソッドに使用されます。 –

2

最初は自立型の関数であるかもしれないと仮定します。 2つ目は、Objective-Cクラスのインスタンスメソッドです。実際にクラスを書く場合は、2番目のバージョンが必要になると思います。

+0

は無料です-standing関数* 単に「フリー」関数に言及すると、malloc/freeと混同する可能性があります。 – dcousens

+0

@ダニエル確かに、私は自分の答えを編集しました。 –

関連する問題