0

私が取り組んでいるプロジェクトで、GitHubのプロジェクトDisk-Arbitratorの DiskArbitration クラスを使用しました。

OS X インストーラー ディスク イメージをマウント/アンマウントしています。また、列挙中にディスク リストが変更され、渡された diskref が になるhdiutilため、コールバック メソッドが定義されている場合もあります。DARegisterDiskDescriptionChangedCallbackNULL

コールバックのために呼び出される関数は次のとおりです。

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;

しかし、それもうまくいきませんでした。コピーを作成する別の方法はありますか?または、これにアプローチする必要がある別の方法がありますか。

4

1 に答える 1