Objective-C는 대부분 C의 수퍼 세트입니다. C와 Objective-C 코드를 결합하려면 단순히 Objective-C 코드 인 것처럼 C 코드를 컴파일하면됩니다. Xcode에서이 작업을 수행하는 가장 쉬운 방법은 해당 파일이 .m
확장자인지 확인하는 것입니다.
Objective-C 세계로 다시 라우팅하려면 Obj-C 개체에 대한 포인터가 필요합니다. 많은 콜백 기반 API를 사용하면 일반 포인터 (void *
)를 제공하여 콜백을 할 때 다시 전달할 수 있습니다.,
context
또는
refcon
ctx
userData
userInfo
콜백 API는 이것을 허용하지 않는 경우 ("참조 상수"에 대한) :이 인수는 몇 가지 일반적인 이름이있다 글로벌 포인터 나 룩업 테이블과 같이 객체에 콜백을 보내려면 좀 더 끔찍한 방법이 필요합니다.
사용중인 API에서 컨텍스트 포인터를 제공 할 수 있습니다. 코드를 다시 호출하면 콜백에 등록 할 때 사용한 포인터가 제공됩니다. 다음은 MyObjCClass
유형의 객체 (아래 -registerMatching
메서드 참조)에서 콜백을 등록한 다음 컨텍스트 포인터를 사용하여 처리를 위해 콜백을 등록한 객체로 콜백을 다시 라우팅하는 예제입니다 (자세한 내용은 Handle_DeviceMatchingCallback
함수의 컨텍스트 사용 참조). 바늘).
/*! @file C-ObjC-Callbacks.m
* Demonstrates routing a C callback to an Obj-C object
* using the callback's context pointer.
*/
#import <Cocoa/Cocoa.h>
#import <IOKit/hid/IOHIDManager.h>
// Global HID manager reference.
IOHIDManagerRef gIOHIDManager;
// HID callback
void Handle_DeviceMatchingCallback(void *context,
IOReturn result,
void *sender,
IOHIDDeviceRef device);
@interface MyObjCClass : NSObject {
}
- (void)registerMatching;
- (void)handleMatchingDevice:(IOHIDDeviceRef)device
sender:(void *)sender
result:(IOReturn)result;
@end
@implementation MyObjCClass
- (void)registerMatching {
// Assume gIOHIDManager has already been created.
// Set up a device matching callback, providing a pointer to |self| as the context.
IOHIDManagerRegisterDeviceMatchingCallback(gIOHIDManager,
Handle_DeviceMatchingCallback,
(void *)self);
}
- (void)handleMatchingDevice:(IOHIDDeviceRef)device
sender:(void *)sender
result:(IOReturn)result {
// Do something...
}
@end
void
Handle_DeviceMatchingCallback(void *context,
IOReturn result,
void *sender,
IOHIDDeviceRef device); {
MyObjCClass *const myObject = (MyObjCClass *const)context;
[myObject handleMatchingDevice:device sender:sender result:result];
}
안녕, 은 신속한 답변에 감사드립니다. 불행히도 C와 코코아를 결합 할 때 나는 나쁜 결과를 낳았습니다. Apple에서 제공하는 새로운 HID 도구 (API)를 사용하려고하면 실제로 잃어 버렸습니다. 포인터가있는 문제 만이 아니며 일부 코드가 이미 사용되었는지 궁금합니다. 임시로이 코드를 C 형식으로 된 별도의 파일에 넣었고 예상대로 NS에 대한 모든 호출이 비참하게 실패합니다. 추가 제안 사항이 있으십니까? 아이디어? 읽기 링크? – Michael