該当クラスのヘッダファイルもないと確実なことはわかりませんが
おそらく target_path のメモリ管理の問題だと思います。
* target_pathをretainありのプロパティにする
* target_pathを適切にretain/releaseする
* GC有効にしてアプリをコンパイルする
のいずれかでEXC_BAD_ACCESSは解消すると思います。
On Sat, 17 Jul 2010 02:02:33 -0700 (PDT), Randy Rhoads wrote:
> 初の投稿ですがよろしくお願い致します。
> NSTaskでOSX固有のコマンドの"diskutil"でドライブのUUIDを取得したいので
> すが質問です。
> 以下のソースでdiskutilからUUIDを取得するコードを組んだのですが、
> EXC_BAD_ACCESSもしくは取得できませんでした。このソー
> スにおかしい部分があったらご指摘願えないでしょうか。
>
> - (IBAction)targetSelect:(id)sender {
> // set string to textField
> [textField setStringValue:@"Please select target hard drive"];
> target_path = [NSString stringWithFormat:@"%@", [opanel filename]];
非GCのとき、ここでretainCountが確保されていないので問題になります。
> - (IBAction)saveSelect:(id)sender {
> task = [[NSTask alloc] init];
> pOutput = [[NSPipe alloc] init];
> pError = [[NSPipe alloc] init];
>
> // コマンドと引数を設定
> [task setLaunchPath:@"/usr/sbin/diskutil"];
>
> [task setArguments:[NSArray arrayWithObjects: @"info", @"%@",
> target_path, nil]];
ここの@"%@"が不要です。
> NSData *dataError = [[pError fileHandleForReading] availableData];
> NSData *dataOutput = [[pOutput fileHandleForReading] availableData];
>
今回は出力が小さいので問題ありませんでしたが、一般的にパイプを使ったときは
出力がなくなるまで何度か読む必要があります。
--
kimura wataru
木村さんがすでにコメントされているので、あえて別の角度で。。
もし、あくまで目的はボリューム情報の取得であって、
特に NSTask や diskutil を使いたいわけではない、ということなら、
API で直接取得したらどうでしょう??
いくつか方法はあるでしょうが、その中でも比較的簡単な方法として、
File Manager と Disk Arbitration Framework を使用した方法を紹介しておきます。
DASessionRef session = DASessionCreate(kCFAllocatorDefault);
OSErr err = noErr;
for (ItemCount volumeIndex = 1; err == noErr || err != nsvErr; volumeIndex++) {
FSVolumeRefNum actualVolume;
err = FSGetVolumeInfo(kFSInvalidVolumeRefNum, volumeIndex, &actualVolume, kFSVolInfoNone, NULL, NULL, NULL);
if (err == noErr) {
GetVolParmsInfoBuffer volumeParms;
err = FSGetVolumeParms(actualVolume, &volumeParms, sizeof(volumeParms));
if (err == noErr) {
if (volumeParms.vMServerAdr == 0) {
DADiskRef disk = DADiskCreateFromBSDName(kCFAllocatorDefault, session, volumeParms.vMDeviceID);
CFDictionaryRef description = DADiskCopyDescription(disk);
CFUUIDRef volumeUUID = CFDictionaryGetValue(description, kDADiskDescriptionVolumeUUIDKey);
NSLog(@"%s: %@", volumeParms.vMDeviceID, volumeUUID);
CFRelease(description);
CFRelease(disk);
}
}
}
}
CFRelease(session);