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

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

Linda Hamilton
풀어 주다: 2024-12-07 11:04:15
원래의
1011명이 탐색했습니다.

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.

1

2

3

4

5

6

7

8

9

10

11

12

13

#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".

1

2

3

4

// MyObject.h

@interface MyObject : NSObject

- (int)doSomethingWith:(void *)aParameter;

@end

로그인 후 복사

1

2

3

4

5

6

7

8

// 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 래퍼 기능을 사용하세요.

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) 관용구를 활용하면 됩니다. 객체지향 구현:

  1. 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> // 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".

1

2

3

@interface MyObject : NSObject

- (int)doSomethingWith:(void *)aParameter;

@end

로그인 후 복사
  1. 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

로그인 후 복사
  1. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿