Objective-C 主要是 C 的超集。为了结合 C 和 Objective-C 代码,您只需像编译 Objective-C 代码一样编译 C 代码。在 Xcode 中执行此操作的最简单方法是确保相关文件具有.m扩展名。
要将处理路由回 Objective-C 世界,您需要一个指向 Obj-C 对象的指针。许多基于回调的 API 允许您提供一个通用指针 ( void *),然后它们在回调时将其传回给您。此参数有几个常用名称:
context或者ctx
refcon(对于“参考常数”)
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];
}