2

通知ハンドラーを投稿するコードがあります

IONotificationPortRef notificationPortRef = IONotificationPortCreate(kIOMasterPortDefault);
if (!notificationPortRef)
{
    return nil;
}

CFRunLoopSourceRef notificationRunLoopSource = IONotificationPortGetRunLoopSource(notificationPortRef);
if (!notificationRunLoopSource)
{
    CFRelease(notificationPortRef);
    return nil;
}
CFRunLoopAddSource(CFRunLoopGetCurrent(), notificationRunLoopSource, kCFRunLoopDefaultMode);

CFDictionaryRef matching = IOServiceMatching (kIOUSBDeviceClassName);
if (!matching)
{
    CFRelease(notificationPortRef);
    return nil;
}

io_iterator_t matchingIterator;
kern_return_t result = IOServiceAddMatchingNotification(notificationPortRef,
                                                        kIOMatchedNotification,
                                                        matching,
                                                        &driverNotificationRoutine,
                                                        self,
                                                        &matchingIterator);

driverNotificationRoutine(self, matchingIterator);

if (result != KERN_SUCCESS)
{
    CFRelease(notificationPortRef);
}

CFRunLoopRun();

そして、このコールバックハンドラー

static void driverNotificationRoutine (void *refcon, io_iterator_t matchingIterator)
{
    NSLog(@"Callback called.");

    if (matchingIterator)
    {
            io_service_t device;
            NSInteger count = 0;
            while (device = IOIteratorNext(matchingIterator)) count++;
            IOObjectRelease(matchingIterator);

            if (count)
            {
                    ...
            }
    }
}

しかし、私のコールバック関数は呼び出されません。USBフラッシュドライブでこれを試しましたが、成功しませんでした。私はどこが間違っていますか?

4

1 に答える 1

1

あるべきではない

IOObjectRelease(matchingIterator);

コールバック関数で。

于 2011-07-05T05:18:20.013 に答える