Kelas EAGLView memerlukan memanggil fungsi ahli daripada kelas C tanpa masalah . Walau bagaimanapun, dalam kelas C, timbul keperluan untuk memanggil fungsi Objektif-C, "[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];", yang tidak boleh dicapai menggunakan sintaks C tulen.
Untuk mencampurkan Objektif-C dan C , teruskan dengan berhati-hati. Berikut ialah pendekatan langkah demi langkah untuk membungkus panggilan Objektif-C menggunakan fungsi pembalut C:
Buat Pengepala Antara Muka 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); }
Tentukan Kelas Objektif-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
Melaksanakan Kelas C:
#include "MyObject-C-Interface.h" class MyCPPClass { public: void someMethod(void *objectiveCObject) { int result = MyObjectDoSomethingWith(objectiveCObject, nullptr); } };
Idiom PIMPL (Penunjuk kepada Pelaksanaan) boleh digunakan untuk pelaksanaan berorientasikan objek :
Takrifkan C Antara Muka:
#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); }
Buat Kelas Objektif-C Antara Muka:
@interface MyObject : NSObject - (int)doSomethingWith:(void *)aParameter; @end
Buat Kelas Objektif-C Perlaksanaan:
#import "MyObject.h" @implementation MyObject { MyClassImpl* _impl; } - (int)doSomethingWith:(void *)aParameter { if (!_impl) _impl = [MyClassImpl new]; return [_impl doSomethingWith:aParameter]; } @end
Melaksanakan C Kelas:
#include "MyObject-C-Interface.h" class MyCPPClass { public: void someMethod(void *objectiveCObject) { int result = MyObjectDoSomethingWith(objectiveCObject, nullptr); } };
Pendekatan ini menyediakan penyelesaian yang lebih terpencil dan fleksibel, membolehkan pelaksanaan Objektif-C dan pembalut C diubah suai tanpa menjejaskan kod C.
Atas ialah kandungan terperinci Bagaimana untuk Memanggil Kaedah Objektif-C daripada Fungsi Ahli C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!