Я использовал классы DiskArbitration из проекта Disk-Arbitrator на GitHub в проекте, над которым я работаю.DiskRef исчезает при перечислении дисков в методе обратного вызова
Я монтаж/размонтирования OS X Installer образами дисков с помощью hdiutil
и иногда метод обратного вызова определяется для DARegisterDiskDescriptionChangedCallback
аварий как список дисков мутируют при перечислении, а затем, что diskref, которые получают передаваемый становится NULL
.
Вот функция, которая называется получить для обратного вызова:
DARegisterDiskDescriptionChangedCallback(session, matching, NULL, DiskDescriptionChangedCallback, (__bridge void *)([NBCDisk class]));
...
void DiskDescriptionChangedCallback(DADiskRef diskRef, CFArrayRef keys, void *context) {
#pragma unused(keys)
if (context != (__bridge void *)([NBCDisk class])) return;
NSSet *uniqueDisksCopy = [uniqueDisks copy];
for (NBCDisk *disk in uniqueDisksCopy) {
if (CFHash(diskRef) == [disk hash]) {
CFDictionaryRef desc = DADiskCopyDescription(diskRef);
disk.diskDescription = desc;
CFRelease(desc);
[[NSNotificationCenter defaultCenter] postNotificationName:DADiskDidChangeNotification object:disk];
}
}
}
Я решил проблему с будучи мутировал при перечислении, сделав копию и перечислить на этот счет.
НО, этот код иногда врезаться с: "*** CFHash() called with NULL ***"
И это потому, что диск исчез и diskRef
вероятно, был освобожден.
Итак, здесь мне нужны советы. Я хотел, чтобы попытаться сделать копию diskRef
и попытался что, делая это:
DADiskRef diskRefCopy = diskRef;
Но это не сработало. Есть ли другой способ сделать копию? Или я должен пойти к этому другому пути.
Когда диск исчез, убедитесь, что 'diskRef' удален из' uniqueDisks' – jeevatkm