AAAAaaarrrrggghhh! Months ago I gave up on receiving notifications from the IOKit when devices changed. The initial matching step would work; I could list all current devices at any instant of time. I must have spent ten hours over two weeks trying to get the notification code to work and got nothing. I wrote Cocoa programs: nothing. I wrote command line programs using CFRunLoop: nothing. I tried different run loop modes: nothing. I was convinced Apple had changed something at a low level and forgot to fix the documentation. I finally implemented UDF Media Reader with timer-based polling.
Today I happened to notice a line in the documentation I had always missed before: "In the case of IOServiceAddMatchingNotification, make sure you release the iterator only if you’re also ready to stop receiving notifications: When you release the iterator you receive from IOServiceAddMatchingNotification, you also disable the notification." That was it. Every test rig I ever made conscientiously cleaned up after itself by releasing the initial iterator, stopping notifications before they ever began.