0

オーディオ録音ファイルのアドレスを配列に格納して後で使用する際に問題が発生します。これは、URL アドレスを取得し、それを文字列に変換して配列に追加する方法です。これはうまくいくようです。

testViewController.h

@interface record_audio_testViewController : UIViewController <AVAudioRecorderDelegate> {       
NSURL *audioFile;
AVAudioRecorder *recorder;
...
}
@property (nonatomic, retain) NSURL *audioFile;

testViewController.m

#import "record_audio_testViewController.h"
@implementation record_audio_testViewController
@synthesize audioFile

- (void)viewDidLoad {
NSMutableArray *urlArray = [[NSMutableArray alloc] init];
    audioFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithFormat: @"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"caf"]]];
    //  convert NSURL to NSString
    NSString *fileLoc = [audioFile absoluteString];
    [urlArray addObject: fileLoc ];
    [[NSUserDefaults standardUserDefaults] setObject:urlArray forKey:@"urlArray"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    [urlArray release];
    //  Create an AVAudioSession object.
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: &error];
    //Activate the session
    [audioSession setActive:YES error: &error];
}

- (void)buttonClicked:(UIButton*)button {
    NSMutableArray *urlArray;
    urlArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"urlArray"];
    audioFile = [NSURL URLWithString: [urlArray objectAtIndex:btnN] ];
    //  at this point, the URL looks exactly as created
}

- (IBAction)  rec_button_pressed {
    NSMutableDictionary* recordSetting = [[NSMutableDictionary alloc] init];
    [recordSetting setValue :[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey];
    [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
    [recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];        
    recorder = [[ AVAudioRecorder alloc] initWithURL: audioFile settings: recordSetting error:&error ]; //  this is where it CRASHES

    [recorder setDelegate:self];
    [recorder prepareToRecord];
    [recorder record];
}

NSLog を使用してこれらのアドレスを調べて比較すると、すべて同じように見えます。しかし、プログラムは例外をスローします:

    Thread 1: EXC_BAD_ACCESS (code=2 address=0x9)

この状況を乗り切る方法を知っている人はいますか?また、これを行うためのより簡単で安全な方法はありますか?

4

1 に答える 1

1

例外がスローされているのはここではないため、表示しているコードはまったく無関係である可能性があります。例外はおそらくメモリ管理エラーが原因であり、NSURL とは関係がない可能性があります。あなたはそれについて推測しているだけです - そしてそうすべきではありません。

コードにはメモリ管理がなく、ARC を使用していないため、メモリ管理の責任を認識していないことが示唆されます。私の本ではそれらについて説明し、可能であれば ARC を使用すべき理由も説明しています。

http://www.apeth.com/iOSBook/ch12.html

また、静的アナライザーを使用します。メモリの不適切な管理の危険な兆候のいくつかを見つけます。

于 2012-09-29T06:02:38.933 に答える