gpt4 book ai didi

objective-c - 从 C 到 Objective-c 的转换

转载 作者:行者123 更新时间:2023-12-04 05:10:12 26 4
gpt4 key购买 nike

我应该如何在objective-c中编写这段代码:

kr = IOServiceAddMatchingNotification(gNotifyPort, 
kIOFirstMatchNotification, matchingDict, RawDeviceAdded, NULL, &gRawAddedIter);

我试过这个:
kr = IOServiceAddMatchingNotification(gNotifyPort, kIOFirstMatchNotification,
matchingDict, @selector(RawDeviceAdded), NULL, &gRawAddedIter);

和功能看起来像:
(void)RawDeviceAdded:(void *)refCon iterator:(io_iterator_t)iterator
{
.....
}

我不确定它是否正确。

最佳答案

简短的回答是:你不能直接这样做。

这是因为 IOKit 是一个 C-API,所以它需要的任何回调函数都必须是 C,而不是 Objective-C。

这并不是说你不能混合使用 C 和 Objective-C,并使用 C 回调函数来蹦床到你的 Objective-C 方法。这只是获取对 C 回调函数的类的引用的问题;在这种特殊情况下,使用 refCon .

SomeObjcClass.m:

// Objective-C method (note that refCon is not a parameter as that
// has no meaning in the Objective-C method)
-(void)RawDeviceAdded:(io_iterator_t)iterator
{
// Do something
}

// C callback "trampoline" function
static void DeviceAdded(void *refCon, io_iterator_t iterator)
{
SomeObjcClass *obj = (SomeObjcClass *)refCon;
[obj RawDeviceAdded:iterator];
}

- (void)someMethod
{
// Call C-API, using a C callback function as a trampoline
kr = IOServiceAddMatchingNotification(gNotifyPort,
kIOFirstMatchNotification,
matchingDict,
DeviceAdded, // trampoline function
self, // refCon to trampoline
&gAddedIter
);

}

关于objective-c - 从 C 到 Objective-c 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14979040/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com