문제

목표 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 기능을 대 Objective-C 호출과 혼합 할 수 있습니까?
  3. C 함수를 Objective-C 메소드와 혼합하려면 어떻게합니까?
도움이 되었습니까?

해결책

C와 객관적인 C 방법 및 기능을 혼합 할 수 있습니다. 다음은 iPhone 앱 내에서 SQLITE API를 사용하는 간단한 예입니다.코스 사이트)

다운로드 zip 파일 (09_mysqlitetableview.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]

Ivars에 접근 할 수 없습니다.

콜백 함수가 취하는 한 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 메소드를 호출 할 수있는 방법/어떻게합니까?

당신은 할 수 없습니다.

CONTURE에서 CONTURE를 객관적인 C 호출과 혼합 할 수 있습니까?

예. C 함수를 작성하고이를 CF 함수의 콜백으로 사용하십시오.

C 함수를 Objective-C 메소드와 혼합하려면 어떻게해야합니까?

당신은 설정할 수 있습니다 self 로서 info 컨텍스트 구조의 포인터. 그것은 콜백으로 전달됩니다. 그런 다음 콜백에서 캐스트하십시오 info 다시 포인터로 id:

MyClass *self = (id)info;

그런 다음 보낼 수 있습니다 self 메시지. C 함수가 @implementation 부분. 당신은 그것들을 속성으로 만들어야합니다. 당신은 이것을 a로 할 수 있습니다 클래스 확장. (그 문서가 말하는 것과는 달리, 당신은 내부의 확장을 선언하지 않을 것입니다. @implementation, 그러나 일반적으로 바로 위의 같은 파일에서.)

이 상황에서 항상 도움이 된 것은 C API 위에 OBJ-C 래퍼를 만드는 것입니다. C 함수를 사용하는 데 필요한 것을 구현하고 그 위에 객관적인 C 클래스 (또는 2)를 구축하므로 모든 외부 세계가 볼 수 있습니다. 예를 들어, 이와 같은 콜백의 경우 다른 객체에서 OBJ-C Delegate 메소드를 호출하는 C 함수를 만들 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top