2

このコードを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
{
  .....
}

その権利かどうかはわかりません。

4

1 に答える 1

3

簡単な答えは次のとおりです。直接行うことはできません。

これは、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
                                          );        

}
于 2013-02-20T11:56:25.367 に答える