Une classe EAGLView nécessite d'appeler une fonction membre à partir d'une classe C sans problème . Cependant, au sein de la classe C, il est nécessaire d'appeler une fonction Objective-C, "[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];", ce qui ne peut pas être réalisé en utilisant la syntaxe C pure.
Pour mélanger Objective-C et C, procédez avec prudence. Voici une approche étape par étape pour encapsuler l'appel Objective-C à l'aide d'une fonction wrapper C :
Créer un en-tête d'interface 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); }
Définir la classe Objective-C :
// 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
Implémenter la classe C :
#include "MyObject-C-Interface.h" class MyCPPClass { public: void someMethod(void *objectiveCObject) { int result = MyObjectDoSomethingWith(objectiveCObject, nullptr); } };
L'idiome PIMPL (Pointer to Implementation) peut être utilisé pour une implémentation orientée objet :
Définir un C Interface :
#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); }
Créer une classe Objective-C Interface :
@interface MyObject : NSObject - (int)doSomethingWith:(void *)aParameter; @end
Créer une implémentation de classe Objective-C :
#import "MyObject.h" @implementation MyObject { MyClassImpl* _impl; } - (int)doSomethingWith:(void *)aParameter { if (!_impl) _impl = [MyClassImpl new]; return [_impl doSomethingWith:aParameter]; } @end
Implémentez la classe C :
#include "MyObject-C-Interface.h" class MyCPPClass { public: void someMethod(void *objectiveCObject) { int result = MyObjectDoSomethingWith(objectiveCObject, nullptr); } };
Cette approche fournit une solution plus isolée et plus flexible, permettant de modifier l'implémentation Objective-C et le wrapper C sans affecter le code C.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!