首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS 开发中在 C/C++ 代码中调用 Objective-C 方法的方法

     編輯:程式設計綜合問答

核心原理

Objective-C 是 C 的**严格超集**,编译器前端 (Clang) 统一处理。.mm 文件(Objective-C++)可直接混编 C/C++ 与 OC 代码。

三种典型场景

1. C++ 类中持有 OC 对象并调用

// Bridge.h (C++ 头文件,对外暴露)
class Bridge {
public:
    void callOCMethod();
private:
    // 使用前向声明或 void* 隐藏 OC 类型
    void* ocObject; // 实际为 id 或具体 OC 类指针
};

// Bridge.mm (Objective-C++ 实现)
#import "Bridge.h"
#import "MyOCClass.h" // 你的 OC 类

void Bridge::callOCMethod() {
    // 将 void* 转回 OC 对象
    id obj = (id)ocObject;
    // 调用 OC 方法
    [obj performSelector:@selector(yourMethod)];
    // 或直接调用(需类型可见)
    // [(MyOCClass*)obj yourMethod];
}

2. 纯 C 函数回调中调用 OC

// C 回调签名
typedef void (*CCallback)(int status);

void cFunctionWithCallback(CCallback cb) {
    // ... 异步操作完成后
    cb(200);
}

// 在 OC 代码中桥接
void myCCallback(int status) {
    // 获取单例或全局 OC 对象
    MyOCManager *mgr = [MyOCManager sharedInstance];
    [mgr handleStatus:status]; // 调用 OC 方法
}

// 注册
cFunctionWithCallback(myCCallback);

3. 使用 Block 封装 OC 方法传给 C++

// C++ 接受 std::function
void cppFunction(std::function handler);

// OC 侧调用
cppFunction(^ (int status) {
    [[MyOCManager sharedInstance] handleStatus:status];
});

关键注意点

  • **文件后缀必须为 .mm** 才能编译 OC 语法。
  • 头文件 (.h/.hpp) **不能**出现 OC 关键字 (@interface, id, #import 等),仅用前向声明或 void* 隔离。
  • ARC 环境下,跨语言持有 OC 对象需注意生命周期:__bridge、__bridge_retained、__bridge_transfer 转换。
  • C++ 异常不要跨过 OC 栈帧,建议在边界捕获转为错误码。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved