OC代码调用C++代码的回调函数步骤
http://hi.baidu.com/52study/item/82ed1838b96725b7b80c033f?connect=qzone
1、C++代码中的回调函数
在C++的头文件中声明回调函数,如typedef void (*OnCompleteCallback)(const char *code, bool flag);
2、C++代码中的结构体
在C++的头文件中声明一个结构体,该结构体中包含回调函数的一个函数声明变量属性。如:
1
2
3
4
5
6
|
typedef struct tagStreamInfo { CFDictionaryRef proxy; // 可以使用Objective-C的数据类型 SInt64 fileSize; OnCompleteCallback Complete; // 回调函数声明 } StreamInfo; |
3、C++代码中声明静态函数
可以使用C++代码中的静态函数来调用回调函数,先声明一个结构体参数或指针类型参数的函数。如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
// util.h文件中声明 class CUtil { public : CUtil(); virtual ~CUtil(); public : Boolean Upload(OnCompleteCallback callback); public : // 注意必须声明为public static void UploadCallBack( void *clientCallbackInfo); }; // util.cpp文件中实现 void CUtil::UploadCallBack( void *clientCallbackInfo) { StreamInfo *info = (StreamInfo *)clientCallbackInfo; // 其他代码 ...... // 回调 if (info->CompleteUpload != NULL) { (*info->CompleteUpload)( "to complete uploading" , true ); } } Boolean CUtil::Upload(OnCompleteCallback callback) { StreamInfo *info = new StreamInfo(); info->CompleteUpload = callback; } |
4、Objective-C代码中实现C++代码中的回调函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
// manager.h文件 void OnCompleteUpload( const char *code, bool flag); @interface manager : NSObject +(manager *)sharedInstance; -( void )upload; -( void )completeUpload:(NSString *)code success:( BOOL )flag; @end // manager.mm文件 // 实现回调函数 void OnCompleteUpload( const char *code, bool flag) { NSString *str = [NSString alloc] initWithUTF8String:code] autorelease]; [manager sharedInstance] completeUpload:str success:flag]; } @implementation manager +(manager *)sharedInstance { static dispatch_once_t onceToken; static *manager instance; dispatch_once(&onceToken,^{ instance=[[manager alloc] init]; return instance; } -( void )completeUpload:(NSString *)code success:( BOOL )flag { NSLog(@ "%@" , code); } -( void )upload { CUtil *utl = new CUtil(); utl->Upload(OnCompleteUpload); // 此处调用回调函数 } @end |