4

Objective-C を実行するとき、次のような関数を書き出す必要がありますか?

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

または、通常の C スタイルを使用できますか:

void someFunction(int a, int b);

C スタイルを実行できる場合、Objective-C スタイルで実行する利点はありますか?

4

4 に答える 4

9

Objective-C は C の単なるスーパー セットであるため、必要に応じて通常の C 関数を使用できます。

クラス、メッセージ、継承などの Objective-C 機能を使用したい場合、そしてもちろん Cocoa/CocoaTouch SDK を使用したい場合は、Objective-C 構文を使用する必要があります。

ファイルに Objective-C と C コードを混在させて、Objective-C メソッドで純粋な C 関数を呼び出すことができます。また、Objective-C ランタイム レイヤーに直接アクセスすることにより (たとえば、objc_msgSend関数を使用して)、純粋な C 関数から Objective-C メソッドを呼び出すこともできます。

于 2012-09-13T10:30:11.673 に答える
9

これは Objective-C の関数ではなく、メソッドです。インスタンスの変数やその他のメソッドにアクセスできます。2つは同等ではありません。ほとんどの場合、Objective-C メソッドを使用する必要があります。なぜC関数を使いたいのですか? あなたは何をしようとしているのですか?

于 2012-09-13T10:30:40.037 に答える
1

最初のステートメントはメソッド宣言で、2 番目のステートメントは関数です。それらはまったく関係のない2つのことです。どちらも Objective-C で受け入れられます。ただし、メソッド宣言は@interface @end. そして、関数宣言はその間に発生することはできません@interface @end

于 2012-09-13T10:31:34.397 に答える
0

2 つの違いは、ジェネリック メソッドとインスタンス メソッドの違いです。最初の例はジェネリック メソッドです。これはどこからでも呼び出すことができ (コンパイラーがそれを見つけられる限り)、オブジェクトのインスタンスを必要としません。CGPointMake(x,y) などのメソッドを使用した場合、これらはジェネリック (C スタイル) メソッドとして設定されます。

someFunction(4,5);

2 番目のタイプはインスタンス メソッドです。これは 1 つのクラス内でのみ定義され、先頭の - は、メソッドを呼び出すためにこのクラスのインスタンスが必要であることを意味します。そう

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

私は、数学やポイント操作メソッドなど、必ずしもいずれかのクラスに属していない単純なユーティリティ メソッドに対して最初のスタイルを使用する傾向があります。ほとんどのメソッドはおそらくインスタンス メソッドである必要がありますが、それはより長い答えです (オブジェクト指向設計)。

于 2013-12-05T17:20:28.753 に答える