gpt4 book ai didi

objective-c - 处理回调

转载 作者:太空狗 更新时间:2023-10-30 03:48:31 25 4
gpt4 key购买 nike

我在 Objective-C 类中有一个方法。它有 2 个用 C 编写的回调函数。类指针即 self 作为 void * 传递给这些函数。在 C 函数中,我创建了一个类型为 class 的指针并分配了 void * 参数。第一个回调函数执行成功。但是 void * 指针在第二个回调函数中变成了 nil 。请注意,我没有在第一次回调中调整指针,但在第二次回调中我仍然得到 nil

有什么想法可能会出错吗?

例如:

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

RawDeviceAdded(NULL, gRawAddedIter, self);

这很好用。但是下面的函数将 self 接收为 nil

kr = IOServiceAddMatchingNotification(gNotifyPort, kIOFirstMatchNotification,
matchingDict, BulkTestDeviceAdded, NULL,
&gBulkTestAddedIter);

BulkTestDeviceAdded(NULL, gBulkTestAddedIter, self);

最佳答案

您的问题是否与 IOKit 回调例程有关?您给出的具体示例的问题是 IOServiceMatchingCallback 仅采用 2 个参数,而不是 3 个。您需要 RawDeviceAdded() 和 BulkTestDeviceAdded() 回调函数来匹配 IOServiceMatchingCallback 原型(prototype)并接受 self 作为第一个参数(refCon),而不是第三个。此外,您需要将 self 作为 IOServiceAddMatchingNotification() 的倒数第二个参数传入,以便通过回调将其传回给您。

在 Objective-C 代码中处理 C 回调的常用方法是使用一个静态函数将回调转发给您的实例。因此,您的示例回调代码如下所示:

static RawDeviceAdded(void* refcon, io_iterator_t iterator)
{
[(MyClass*)refcon rawDeviceAdded:iterator];
}

@implementation MyClass
- (void)setupCallbacks
{
// ... all preceding setup snipped
kr = IOServiceAddMatchingNotification(gNotifyPort,kIOFirstMatchNotification, matchingDict,RawDeviceAdded,(void*)self,&gRawAddedIter );
// call the callback method once to 'arm' the iterator
[self rawDeviceAdded:gRawAddedIterator];
}
- (void)rawDeviceAdded:(io_iterator_t)iterator
{
// take care of the iterator here, making sure to complete iteration to re-arm it
}
@end

关于objective-c - 处理回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/316879/

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