首頁 >後端開發 >C++ >如何從 C 成員函數呼叫 Objective-C 方法?

如何從 C 成員函數呼叫 Objective-C 方法?

Linda Hamilton
Linda Hamilton原創
2024-12-07 11:04:15992瀏覽

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);
}
    • 定義 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
    • 實作 C類別:
在 C 類別頭檔「MyCPPClass.h」中包含 C 介面頭檔並使用 C 包裝函數。
#include "MyObject-C-Interface.h"

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

    用於物件導向實現的PIMPL 慣用法
  1. PIMPL(指向實作的指標)慣用法可用於物件導向>

      定義一個 C介面:
  2. 建立一個頭檔“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);
}
    • 建立Objective-C類別介面:
  1. 定義一個頭檔"MyObject.h".
@interface MyObject : NSObject
- (int)doSomethingWith:(void *)aParameter;
@end
#import "MyObject.h"
@implementation MyObject {
    MyClassImpl* _impl;
}
- (int)doSomethingWith:(void *)aParameter {
    if (!_impl) _impl = [MyClassImpl new];
    return [_impl doSomethingWith:aParameter];
}
@end
  1. 創建Objective-C類別實作:
#include "MyObject-C-Interface.h"

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

定義一個實作檔案“MyObject.mm”,在其中實例化MyObject 實例MyObject.實作 C類別:包含C 介面C 類別頭檔「MyCPPClass.h」中的頭檔並使用C 包裝器 這種方法提供了一個更隔離和靈活的解決方案,使Objective-C 實作和 C包裝器能夠在不影響 C 程式碼的情況下進行修改。

以上是如何從 C 成員函數呼叫 Objective-C 方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn