2016-03-23 6 views
-2

今日、私はC++からObjective-cメソッドへのコールバック・パスに取り組んでいます。
最後に、私はそれを試しましたが、いくつかのコードが私を混乱させます。コールバックを実装するためのObjective-C、人々通常の使用ブロックで
は、ブロックの宣言は次のようになります。'void(*)(int)'は 'void(^)(int)'と同じですか?

戻り値の(^ blockNameを)(たparameterTypes)

私はまた、C++のコールバックについて学びました、このように定義された同じタイプのコールバック:

戻り値の(* FUNCNAME)(たparameterTypes)

私に警告私はObjective-CのにC++からのコールバックを渡さ

、コンパイラは:

 
"Cannot initialize a parameter of type 'void (^)(int)' with an rvalue of type 'void (*)(int)" 

最後に、私は*^を変更し、それが動作します。私は知っていると思う、^*の違いは何ですか?それは同じ動作ですか?

+2

C++では '^が'それがであるのと同様にビットごとのXOR – DimChtz

+0

@DimChtzです目標-C。状況によって違いが生じます。 – trojanfoe

答えて

2

これはブロックである。

returnType (^blockName)(parameterTypes) 

これは、関数ポインタである:

returnType (*funcName)(parameterTypes) 

彼らは互換性がありません。

+0

私が知りたいことは、実行時の動作の違いです。 – DelphiQin

+0

@DelphiQinあなたはそれを聞いていませんでしたが、両方のコンセプトについてオンラインで豊富なドキュメントがあります。 – trojanfoe

1

標準のCおよびC++には呼び出し可能なブロックがありません。しかし、これらの言語用のコンパイラの中には、機能を拡張機能として実装しているものがあります。私が見ているドキュメントの中には、Objective Cに対するAppleの拡張であることが示唆されているものもありますが、Objective CはAppleの世界の外ではほとんど使われていません。

どのような言語でも、コールバックを関数として実装する場合は、そのコールバックを関数ポインタを介して意図した呼び出し元に提示する必要があり、呼び出し元はその形式で受け入れる準備が必要です。一方、コールバックをブロックとして実装する場合は、ブロックポインタを使用して呼び出し元にそれを提示し、呼び出し元はフォームを受け入れる用意ができている必要があります。 2つは互換性がなく、あなたが提示した構文が異なります。しかし、別々のパラメータまたは完全に別々の登録機能を介して両方の形式を受け入れるメカニズムを設計することは可能です。

+0

あなたの答えをありがとう、それは私を助けた。 :) – DelphiQin

1

Objective-Cブロック(^)は、関数ポインタ(*)と互換性がありません。
関数ポインタと比較すると、周囲のコンテキストから値と変数を取得できるという利点があります(クロージャ)。

これは、ブロックから関数ポインタを呼び出すラッパーを書くのは簡単です:

typedef int (*funptr)(int); 
typedef int (^funblock)(int); 


int use_block_callback(int y, funblock fb) 
{ 
    return fb(y); 
} 

int use_funptr_callback(int y, funptr f) 
{ 
    return use_block_callback(y,^int (int x) { return f(x); }); 
} 

int add_one(int x) { return x + 1; } 

int foo(int x) 
{ 
    return use_funptr_callback(23, add_one); 
} 

// Or 
int (*some_pointer)(int) = add_one; 
int (^some_block)(int) =^int (int x) { return some_pointer(x); } 

"Programming with Objective-C" about blocks.

+0

あなたの答えをありがとう、それは私を助けた。 :) – DelphiQin

関連する問題