私が取り組んでいるプロジェクトで、GitHubのプロジェクトDisk-Arbitratorの DiskArbitration クラスを使用しました。
OS X インストーラー ディスク イメージをマウント/アンマウントしています。また、列挙中にディスク リストが変更され、渡された diskref が になるhdiutil
ため、コールバック メソッドが定義されている場合もあります。DARegisterDiskDescriptionChangedCallback
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;
しかし、それもうまくいきませんでした。コピーを作成する別の方法はありますか?または、これにアプローチする必要がある別の方法がありますか。