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
|