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
Freigeben: 2024-12-07 11:04:15
Original
979 Leute haben es durchsucht

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);
}
Nach dem Login kopieren
  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
Nach dem Login kopieren
// MyObject.mm
#import "MyObject.h"
@implementation MyObject
- (int)doSomethingWith:(void *)aParameter {
    // Implement Objective-C function
    return 42;
}
@end
Nach dem Login kopieren
  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);
    }
};
Nach dem Login kopieren
Nach dem Login kopieren

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);
}
Nach dem Login kopieren
  1. Erstellen Sie eine Objective-C-Klasse Schnittstelle:

    • Definieren Sie eine Header-Datei „MyObject.h“.
@interface MyObject : NSObject
- (int)doSomethingWith:(void *)aParameter;
@end
Nach dem Login kopieren
  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
Nach dem Login kopieren
  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);
    }
};
Nach dem Login kopieren
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage