0

将录音文件地址存储在数组中并在以后使用时遇到问题。这就是我获取 URL 地址、将其转换为字符串并将其添加到数组中的方式。这似乎有效。

测试视图控制器.h

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

测试视图控制器.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.aeth.com/iOSBook/ch12.html

另外,使用静态分析器;它会发现一些内存管理不善的危险迹象。

于 2012-09-29T06:02:38.933 回答