Heim >Backend-Entwicklung >C++ >Wie rufe ich eine Objective-C-Methode aus einer C-Member-Funktion auf?

Wie rufe ich eine Objective-C-Methode aus einer C-Member-Funktion auf?

Linda Hamilton
Linda HamiltonOriginal
2024-12-07 11:04:151030Durchsuche

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

Aufrufen einer Objective-C-Methode aus einer C-Member-Funktion

Problem

Eine EAGLView-Klasse erfordert den problemlosen Aufruf einer Member-Funktion aus einer C-Klasse . Allerdings besteht innerhalb der C-Klasse die Notwendigkeit, eine Objective-C-Funktion „[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];“ aufzurufen, was mit reiner C-Syntax nicht erreicht werden kann.

Lösung

Um Objective-C und C zu mischen, gehen Sie vorsichtig vor. Hier ist eine Schritt-für-Schritt-Anleitung zum Umschließen des Objective-C-Aufrufs mithilfe einer C-Wrapper-Funktion:

  1. Erstellen Sie einen C-Schnittstellen-Header:

    • Erstellen Sie eine Header-Datei mit dem Namen „MyObject-C-Interface.h“, die einen C-Wrapper definiert Funktion.
#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. Definieren Sie die Objective-C-Klasse:

    • Erstellen Sie eine Header-Datei „MyObject.h“ und Implementierungsdatei „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. Implementieren Sie die C-Klasse:

    • Fügen Sie den C-Schnittstellenheader in den C-Klassenheader „MyCPPClass.h“ ein und verwenden Sie den C-Wrapper Funktion.
#include "MyObject-C-Interface.h"

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

PIMPL-Idiom für objektorientierte Implementierung

Das PIMPL-Idiom (Pointer to Implementation) kann für eine objektorientierte Implementierung verwendet werden :

  1. Definieren Sie ein C Schnittstelle:

    • Erstellen Sie eine Header-Datei „MyObject-C-Interface.h“, die eine Klasse mit Wrapper-Methoden definiert.
#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. Erstellen Sie eine Objective-C-Klasse Schnittstelle:

    • Definieren Sie eine Header-Datei „MyObject.h“.
@interface MyObject : NSObject
- (int)doSomethingWith:(void *)aParameter;
@end
  1. Erstellen Sie eine Objective-C-Klassenimplementierung:

    • Definieren Sie eine Implementierung Datei „MyObject.mm“, die eine MyObject-Instanz innerhalb von MyObject instanziiert.
#import "MyObject.h"
@implementation MyObject {
    MyClassImpl* _impl;
}
- (int)doSomethingWith:(void *)aParameter {
    if (!_impl) _impl = [MyClassImpl new];
    return [_impl doSomethingWith:aParameter];
}
@end
  1. Implementieren Sie die C-Klasse:

    • Fügen Sie den C-Schnittstellenheader in den C-Klassenheader „MyCPPClass.h“ ein und verwenden Sie die C Wrapper-Funktion.
#include "MyObject-C-Interface.h"

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

Dieser Ansatz bietet eine isoliertere und flexiblere Lösung, die es ermöglicht, die Objective-C-Implementierung und den C-Wrapper zu ändern, ohne den C-Code zu beeinträchtigen.

Das obige ist der detaillierte Inhalt vonWie rufe ich eine Objective-C-Methode aus einer C-Member-Funktion auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn