목표-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);
- 이를 대신하여 목표-C 방법을 호출할 수 있습니까?
- 목표-C 호출과 C 함수를 혼합할 수 있습니까?
- 목표-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
'programing' 카테고리의 다른 글
기능을 병렬로 실행하는 방법은 무엇입니까? (0) | 2023.06.09 |
---|---|
IE의 호환성 모드를 서버 측에서 강제로 해제하는 방법은 무엇입니까? (0) | 2023.06.09 |
boto3를 사용하여 S3 객체를 파일에 저장하는 방법 (0) | 2023.06.09 |
파이어베이스로 추가 사용자 정보 추가 (0) | 2023.06.09 |
Excel의 행/열 값 재정렬/셔플 (0) | 2023.06.09 |