web-dev-qa-db-ja.com

C関数対Objective-Cメソッド?

2つの違いは何ですか?私がプログラムを書いている場合、いつこれが必要ですか?

void aFunction() {
    //do something
}

そしていつこれが必要になるでしょう:

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

実際、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で検索して)メソッドの適切な実装を見つけ、その後、末尾呼び出し最適化の魔法を通して、すべての意図と目的のために、メソッドの実装にジャンプします。次のようなC関数呼び出しとまったく同じように機能します。

function(someObject, @selector(aMethod));

文字通り、Objective-CはもともとCプリプロセッサとしてのみ実装されていました。 すべて Objective-Cで実行できることは、ストレートCに書き直すことができます。

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


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

比較的スタンドアロンの独自のモデルレベルのコードを記述する場合でも、オブジェクト指向プログラミングの基本的なテナントである状態/データと機能の間の非常に自然な接着を提供するという理由だけで、通常はObjective-Cを使用します。

79
bbum

Objective-Cでは、各関数はobjectに作用します。

_[myObject myFunction]_

Cメソッドの形式は次のとおりです。

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

Objective-C instanceメソッドの形式は次のとおりです。

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

または複数引数関数の場合

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

Cタイプの関数も引き続き使用できますが、私は常にObj-CプログラミングでObjective-Cスタイルのメソッドを使用しています。

Cで_[myObject myMethod:arg]_に相当するものはmyObject.myMethod(arg)かもしれません

9
aqua

1つ目は、独立した関数です。 2番目は、Objective-Cクラスのインスタンスメソッドです。したがって、実際にクラスを作成している場合は、2番目のバージョンが必要になると思います。

2