EAGLView 클래스를 사용하려면 문제 없이 C 클래스에서 멤버 함수를 호출해야 합니다. . 그러나 C 클래스 내에서는 순수 C 구문으로는 달성할 수 없는 Objective-C 함수인 "[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];"를 호출해야 할 필요성이 발생합니다.
Objective-C와 C를 혼합하려면 주의해서 진행하세요. 다음은 C 래퍼 함수를 사용하여 Objective-C 호출을 래핑하는 단계별 접근 방식입니다.
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 @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 클래스 구현:
#include "MyObject-C-Interface.h" class MyCPPClass { public: void someMethod(void *objectiveCObject) { int result = MyObjectDoSomethingWith(objectiveCObject, nullptr); } };
PIMPL(Pointer to Implementment) 관용구를 활용하면 됩니다. 객체지향 구현:
C 인터페이스 정의:
#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 클래스 인터페이스 생성:
@interface MyObject : NSObject - (int)doSomethingWith:(void *)aParameter; @end
Objective-C 클래스 구현 생성:
#import "MyObject.h" @implementation MyObject { MyClassImpl* _impl; } - (int)doSomethingWith:(void *)aParameter { if (!_impl) _impl = [MyClassImpl new]; return [_impl doSomethingWith:aParameter]; } @end
C 클래스 구현:
#include "MyObject-C-Interface.h" class MyCPPClass { public: void someMethod(void *objectiveCObject) { int result = MyObjectDoSomethingWith(objectiveCObject, nullptr); } };
이 접근 방식은 C 코드에 영향을 주지 않고 Objective-C 구현과 C 래퍼를 수정할 수 있도록 하여 더욱 격리되고 유연한 솔루션을 제공합니다.
위 내용은 C 멤버 함수에서 Objective-C 메서드를 호출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!