C 멤버 함수에서 Objective-C 메서드 호출
문제
EAGLView 클래스를 사용하려면 문제 없이 C 클래스에서 멤버 함수를 호출해야 합니다. . 그러나 C 클래스 내에서는 순수 C 구문으로는 달성할 수 없는 Objective-C 함수인 "[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];"를 호출해야 할 필요성이 발생합니다.
해결책
Objective-C와 C를 혼합하려면 주의해서 진행하세요. 다음은 C 래퍼 함수를 사용하여 Objective-C 호출을 래핑하는 단계별 접근 방식입니다.
-
C 인터페이스 헤더 만들기:
- C 래퍼를 정의하는 "MyObject-C-Interface.h"라는 헤더 파일을 만듭니다. function.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # include <stdio.h>
# include <stdint.h>
typedef uintptr_t Id;
extern void EAGLViewDoSomethingWith(Id* poself, void *aparam);
int MyObjectDoSomethingWith(void *myObjectInstance, void *parameter) {
printf( "C wrapper function called!\n" );
return EAGLViewDoSomethingWith(myObjectInstance, 21);
}
|
로그인 후 복사
-
Objective-C 클래스 정의:
- 헤더 파일 "MyObject.h" 및 구현 파일 "MyObject.mm".
1 2 3 4 | @ interface MyObject : NSObject
- (int)doSomethingWith:(void *)aParameter;
@ end
|
로그인 후 복사
1 2 3 4 5 6 7 8 | #import "MyObject.h"
@implementation MyObject
- (int)doSomethingWith:(void *)aParameter {
return 42;
}
@ end
|
로그인 후 복사
-
C 클래스 구현:
- C 클래스 헤더 "MyCPPClass.h"에 C 인터페이스 헤더를 포함하고 C 래퍼 기능을 사용하세요.
1 2 3 4 5 6 7 8 | # include "MyObject-C-Interface.h"
class MyCPPClass {
public :
void someMethod(void *objectiveCObject) {
int result = MyObjectDoSomethingWith(objectiveCObject, nullptr);
}
};
|
로그인 후 복사
로그인 후 복사
객체 지향 구현을 위한 PIMPL 관용구
PIMPL(Pointer to Implementment) 관용구를 활용하면 됩니다. 객체지향 구현:
-
C 인터페이스 정의:
- 다음을 정의하는 헤더 파일 "MyObject-C-Interface.h"를 만듭니다. 래퍼가 있는 클래스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # include <stdio.h>
# include <stdint.h>
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 클래스 인터페이스 생성:
1 2 3 | @ interface MyObject : NSObject
- (int)doSomethingWith:(void *)aParameter;
@ end
|
로그인 후 복사
-
Objective-C 클래스 구현 생성:
- MyObject 인스턴스를 인스턴스화하는 구현 파일 "MyObject.mm"을 정의합니다. MyObject.
1 2 3 4 5 6 7 8 9 | #import "MyObject.h"
@implementation MyObject {
MyClassImpl* _impl;
}
- (int)doSomethingWith:(void *)aParameter {
if (!_impl) _impl = [MyClassImpl new ];
return [_impl doSomethingWith:aParameter];
}
@ end
|
로그인 후 복사
-
C 클래스 구현:
- C 인터페이스 포함 C 클래스 헤더 "MyCPPClass.h"에 헤더를 추가하고 C 래퍼를 사용합니다.
1 2 3 4 5 6 7 8 | # 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!