>백엔드 개발 >C++ >C 멤버 함수에서 Objective-C 메서드를 호출하는 방법은 무엇입니까?

C 멤버 함수에서 Objective-C 메서드를 호출하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-07 11:04:15993검색

How to Call an Objective-C Method from a C   Member Function?

C 멤버 함수에서 Objective-C 메서드 호출

문제

EAGLView 클래스를 사용하려면 문제 없이 C 클래스에서 멤버 함수를 호출해야 합니다. . 그러나 C 클래스 내에서는 순수 C 구문으로는 달성할 수 없는 Objective-C 함수인 "[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];"를 호출해야 할 필요성이 발생합니다.

해결책

Objective-C와 C를 혼합하려면 주의해서 진행하세요. 다음은 C 래퍼 함수를 ​​사용하여 Objective-C 호출을 래핑하는 단계별 접근 방식입니다.

  1. C 인터페이스 헤더 만들기:

    • C 래퍼를 정의하는 "MyObject-C-Interface.h"라는 헤더 파일을 만듭니다. function.
#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);
}
  1. Objective-C 클래스 정의:

    • 헤더 파일 "MyObject.h" 및 구현 파일 "MyObject.mm".
// 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
  1. C 클래스 구현:

    • C 클래스 헤더 "MyCPPClass.h"에 C 인터페이스 헤더를 포함하고 C 래퍼 기능을 사용하세요.
#include "MyObject-C-Interface.h"

class MyCPPClass {
public:
    void someMethod(void *objectiveCObject) {
        int result = MyObjectDoSomethingWith(objectiveCObject, nullptr);
    }
};

객체 지향 구현을 위한 PIMPL 관용구

PIMPL(Pointer to Implementment) 관용구를 활용하면 됩니다. 객체지향 구현:

  1. C 인터페이스 정의:

    • 다음을 정의하는 헤더 파일 "MyObject-C-Interface.h"를 만듭니다. 래퍼가 있는 클래스
#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);
}
  1. Objective-C 클래스 인터페이스 생성:

    • 정의 헤더 파일 "MyObject.h".
@interface MyObject : NSObject
- (int)doSomethingWith:(void *)aParameter;
@end
  1. Objective-C 클래스 구현 생성:

    • MyObject 인스턴스를 인스턴스화하는 구현 파일 "MyObject.mm"을 정의합니다. MyObject.
#import "MyObject.h"
@implementation MyObject {
    MyClassImpl* _impl;
}
- (int)doSomethingWith:(void *)aParameter {
    if (!_impl) _impl = [MyClassImpl new];
    return [_impl doSomethingWith:aParameter];
}
@end
  1. C 클래스 구현:

    • C 인터페이스 포함 C 클래스 헤더 "MyCPPClass.h"에 헤더를 추가하고 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.