2015-06-19 3 views
0

Я использовал классы 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; 

Но это не сработало. Есть ли другой способ сделать копию? Или я должен пойти к этому другому пути.

+0

Когда диск исчез, убедитесь, что 'diskRef' удален из' uniqueDisks' – jeevatkm

ответ

0

Итак, мне нужны некоторые советы здесь. Я хотел, чтобы попытаться сделать копию diskRef, и пытался что, делая это:

DADiskRef diskRefCopy = diskRef;

Поскольку вы взаимодействуете с ядра фонда; использовать -

CFRetain(diskRef); 

Кроме того, обратите внимание на следующие ссылки в Disk-Arbitrator проекта Файл Disk.m в строке #80:

disk = CFRetain(diskRef);

И линии #75:

return [uniqueDisk retain];

Надеюсь, это поможет! BTW с копированием не требуется NSSet *uniqueDisksCopy = [uniqueDisks copy];.

+0

Спасибо за ваш ответ, это помогло мне найти проблему, с которой я столкнулся. –

Смежные вопросы