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
原文地址:https://www.cnblogs.com/willbin/p/2983878.html