programing

목표-C 클래스에서 C 함수 혼합

showcode 2023. 6. 9. 22:12
반응형

목표-C 클래스에서 C 함수 혼합

나는 Objective-C 클래스를 작성하고 있지만 C로 작성된 API를 사용합니다.C 호출을 Objective-C 호출과 혼합하면 문제가 거의 발생하지 않으므로 대부분 문제가 없습니다.

그러나 API 호출 중 하나에는 콜백 방법(예)이 필요합니다.

success = CFHostSetClient(host, MyCFHostClientCallBack, &context);

어디에MyCFHostClientCallBack는 다음과 같이 정의된 C 함수입니다.

static void MyCFHostClientCallBack(CFHostRef host, CFHostInfoType typeInfo, const CFStreamError *error, void *info);
  1. 이를 대신하여 목표-C 방법을 호출할 수 있습니까?
  2. 목표-C 호출과 C 함수를 혼합할 수 있습니까?
  3. 목표-C 방법과 C 함수를 어떻게 혼합합니까?

C와 Objective-C 메소드와 함수의 혼합이 가능하며, iPhone App 내에서 SQLite API를 사용하는 간단한 예는 다음과 같습니다. (코스 사이트)

Zip 파일 다운로드(09_My)SQLiteTableView.zip)

C 함수는 외부에서 선언되어야 합니다.@implementation목표-C(.m) 파일에 저장합니다.

int MyCFunction(int num, void *data)
{
     //code here...
}

@implementation

- (void)MyObjectiveCMethod:(int)number withData:(NSData *)data
{
      //code here
}

@end

왜냐하면 C 함수가 외부에 있기 때문입니다.@implementation다음과 같은 메서드를 호출할 수 없습니다.

[self doSomething]

그리고 아이바에 접근할 수 없습니다.

콜백 기능이 다음을 수행하는 동안 이 문제를 해결할 수 있습니다.userInfo또는context유형 매개변수, 일반적으로 유형void*이를 사용하여 Objective-C 객체를 C 함수로 전송할 수 있습니다.

샘플 코드에서와 같이, 이는 일반적인 목표-C 작동으로 조작할 수 있습니다.

또한 이 답변을 읽어 보십시오. 목표-C 클래스에서 C 함수 혼합

C 콜백에서 Objective-C 코드를 호출하려면 다음과 같은 방법을 사용합니다.

void * refToSelf;
int cCallback()
{
    [refToSelf someMethod:someArg];
}

@implementation SomeClass
- (id) init
{
     self = [super init];
     refToSelf = self;
}
- (void) someMethod:(int) someArg
{
}

이를 대신하여 목표-C 방법을 호출할 수 있습니까?

안 돼요.

목표-C 통화와 C 함수를 함께 사용할 수 있습니까?

네. C 함수를 작성하여 CF 함수에 대한 콜백으로 사용합니다.

목표-C 방법과 C 함수를 어떻게 혼합합니까?

설정할 수 있습니다.self처럼info포인터를 사용할 수 있습니다.그것은 콜백으로 전달될 것입니다.그런 다음, 콜백에서,info에 대한 지침.id:

MyClass *self = (id)info;

그러면 전송할 수 있습니다.self메시지입니다.그러나 C 함수가 외부에 있기 때문에 인스턴스 변수에 직접 액세스할 수 없습니다.@implementation부분.당신은 그것들을 속성으로 만들어야 할 것입니다.클래스 확장을 사용하여 이 작업을 수행할 수 있습니다. (문서에 나와 있는 내용과 달리 내부에 확장을 선언하지 않습니다.@implementation그러나 일반적으로 그 바로 위에 있는 동일한 파일에 있습니다.)

이 상황에서 항상 도움이 되는 것은 C API 위에 Obj-C 래퍼를 만드는 것입니다.C 함수를 사용하는 데 필요한 것을 구현하고, 그 위에 목표 C 클래스(또는 두 개)를 구축하면 외부 세계가 그것을 볼 수 있습니다.예를 들어, 이와 같은 콜백의 경우 다른 개체에 대해 Obj-C 위임 메서드를 호출하는 C 함수를 만들 수 있습니다.

.m inside 내부함 수출호안에 있는.c:

  • CrifanLib.h
#ifndef CrifanLib_h
#define CrifanLib_h

#include <stdio.h>

void fileModeToStr(mode_t mode, char * modeStrBuf);

#endif /* CrifanLib_h */
  • CrifanLib.c
#include "CrifanLib.h"

#include <stdbool.h>

void fileModeToStr(mode_t mode, char * modeStrBuf) {
    // buf must have at least 10 bytes
    const char chars[] = "rwxrwxrwx";
    for (size_t i = 0; i < 9; i++) {
//        buf[i] = (mode & (1 << (8-i))) ? chars[i] : '-';
        bool hasSetCurBit = mode & (1 << (8-i));
        modeStrBuf[i] = hasSetCurBit ? chars[i] : '-';
    }
    modeStrBuf[9] = '\0';
}

에 의해 불려진Objective-C.m:

#include “CrifanLib.h"

@interface JailbreakDetectionViewController ()

@end

@implementation JailbreakDetectionViewController
…

char* statToStr(struct stat* statInfo){
    char stModeStr[10];
    fileModeToStr(statInfo->st_mode, stModeStr);
...
}

...

다 했어요.

언급URL : https://stackoverflow.com/questions/801976/mixing-c-functions-in-an-objective-c-class

반응형