首页 >后端开发 >C++ >如何从 C 成员函数调用 Objective-C 方法?

如何从 C 成员函数调用 Objective-C 方法?

Linda Hamilton
Linda Hamilton原创
2024-12-07 11:04:151005浏览

How to Call an Objective-C Method from a C   Member Function?

从 C 成员函数调用 Objective-C 方法

问题

EAGLView 类需要从 C 类调用成员函数而不会出现问题。然而,在 C 类中,需要调用 Objective-C 函数“[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];”,这是使用纯 C 语法无法实现的。

解决方案

要混合 Objective-C 和 C ,请谨慎行事。以下是使用 C 包装函数包装 Objective-C 调用的分步方法:

  1. 创建 C 接口标头:

    • 创建一个名为“MyObject-C-Interface.h”的头文件,它定义了一个 C 包装器
#include <stdio.h> // for printf
#include <stdint.h> // for uintptr_t

typedef uintptr_t Id;

// Assume a simplified EAGLView class
extern void EAGLViewDoSomethingWith(Id* poself, void *aparam);

int MyObjectDoSomethingWith(void *myObjectInstance, void *parameter) {
    printf("C wrapper function called!\n");
    // Assuming Objective-C method takes a single int argument
    return EAGLViewDoSomethingWith(myObjectInstance, 21);
}
  1. 定义 Objective-C 类:

    • 创建一个头文件“MyObject.h”和实现文件"MyObject.mm".
// MyObject.h
@interface MyObject : NSObject
- (int)doSomethingWith:(void *)aParameter;
@end
// MyObject.mm
#import "MyObject.h"
@implementation MyObject
- (int)doSomethingWith:(void *)aParameter {
    // Implement Objective-C function
    return 42;
}
@end
  1. 实现 C 类:

    • 在 C 类头文件“MyCPPClass.h”中包含 C 接口头文件并使用 C 包装函数。
#include "MyObject-C-Interface.h"

class MyCPPClass {
public:
    void someMethod(void *objectiveCObject) {
        int result = MyObjectDoSomethingWith(objectiveCObject, nullptr);
    }
};

用于面向对象实现的 PIMPL 惯用法

PIMPL(指向实现的指针)惯用法可用于面向对象实现:

  1. 定义一个 C 接口:

    • 创建一个头文件“MyObject-C-Interface.h”,定义一个带包装器的类
#include <stdio.h> // for printf
#include <stdint.h> // for uintptr_t

typedef uintptr_t Id;

class MyClassImpl {
public:
    MyClassImpl() : self(nullptr) {}
    ~MyClassImpl() { if (self) dealloc(); }
    int doSomethingWith(void *parameter) { return 42; }
private:
    Id self;
    void dealloc() { if (self) free(self); }
};

int EAGLViewDoSomethingWith(Id* poself, void* aparam);

int MyObjectDoSomethingWith(void *myObjectInstance, void *parameter) {
    printf("C wrapper function called!\n");
    return EAGLViewDoSomethingWith(myObjectInstance, 21);
}
  1. 创建 Objective-C 类接口:

    • 定义一个头文件"MyObject.h".
@interface MyObject : NSObject
- (int)doSomethingWith:(void *)aParameter;
@end
  1. 创建 Objective-C 类实现:

    • 定义一个实现文件“MyObject.mm”,在其中实例化 MyObject 实例MyObject.
#import "MyObject.h"
@implementation MyObject {
    MyClassImpl* _impl;
}
- (int)doSomethingWith:(void *)aParameter {
    if (!_impl) _impl = [MyClassImpl new];
    return [_impl doSomethingWith:aParameter];
}
@end
  1. 实现 C 类:

    • 包含 C 接口C 类头文件“MyCPPClass.h”中的头文件并使用 C 包装器
#include "MyObject-C-Interface.h"

class MyCPPClass {
public:
    void someMethod(void *objectiveCObject) {
        int result = MyObjectDoSomethingWith(objectiveCObject, nullptr);
    }
};

这种方法提供了一个更加隔离和灵活的解决方案,使 Objective-C 实现和 C 包装器能够在不影响 C 代码的情况下进行修改。

以上是如何从 C 成员函数调用 Objective-C 方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn