Question

I have code to set up notification for USB device add/remove using XCode 4.3.3 on OS X 10.7.4. For a USB device with myVid and myPid, it is pretty boilerplate:

// Global declarations somewhere near the top of the file.  
IONotificationPortRef g_notificationPort= NULL;  
io_object_t g_notification= 0;  
io_iterator_t g_iteratorAdded= 0; 
.
.
.
- (BOOL)setupDeviceNotification  
{  
// Set up matching dictionary.  
NSMutableDictionary* matchingDictionary= (NSMutableDictionary*)IOServiceMatching(kIOUSBDeviceClassName);  
[matchingDictionary setObject:[NSNumber numberWithLong:myVid] forKey:[NSString stringWithUTF8String:kUSBVendorID]];  
[matchingDictionary setObject:[NSNumber numberWithLong:myPid] forKey:[NSString stringWithUTF8String:kUSBProductID]];  

// Create a run loop source for the notification object.  
g_notificationPort= IONotificationPortCreate(kIOMasterPortDefault);  
CFRunLoopSourceRef notificationRunLoopSource= IONotificationPortGetRunLoopSource(g_notificationPort);  
CFRunLoopAddSource(CFRunLoopGetCurrent(), notificationRunLoopSource, kCFRunLoopDefaultMode);  

// Set up a notification callback for device addition on first match.  
kern_return_t kRet= IOServiceAddMatchingNotification(g_notificationPort, kIOFirstMatchNotification, (CFMutableDictionaryRef)matchingDictionary, deviceAddedCallback, (void*)self, &g_iteratorAdded);  

// Rudimentary error handling.  
if(KERN_SUCCESS != kRet)  
{  
  [matchingDictionary release];  
  return FALSE;  
}  

// Arm the notification and check for existing devices.  
[self deviceWasAdded:g_iteratorAdded];  

return TRUE;
}

This code works well, and when a device is added, I use IOServiceAddInterestNotification using the IONotificationPortRef and store the io_object_t that is set in a global object.

Upon analyzing this code to do a little refactoring (making the globals into object variables in the class), I realized I am never calling IONotificationPortDestroy on my IONotificationPortRef object. Should I call it? Also, I am not doing anything with the io_object_t that is assigned in IOServiceAddInterestNotification - is there any cleanup required there?

Était-ce utile?

La solution

OK, one thing I have found after poking around in a lot of Apple documentation is that I should really do an IOObjectRelease on the io_object_t that is the notification. I found a couple of references to it, but the easiest is in the document "User-Mode USB Device Arbitration" on the Apple Developer site.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top