오디오 녹음 파일 주소를 배열에 저장하고 나중에 사용하는 데 문제가 있습니다. URL 주소를 가져 와서 문자열로 변환하여 배열에 추가하는 방법입니다. 이것은 작동하는 것 같습니다.NSMutableArray에서 검색 한 후 NSURL이 작동하지 않습니다.
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를 사용하여이 주소를보고 비교하면 모두 동일하게 보입니다. 그러나이 프로그램은 예외를 throw합니다.
Thread 1: EXC_BAD_ACCESS (code=2 address=0x9)
누구나이 상황을 어떻게 극복 할 수 있는지 알고 있습니까? 또한 더 쉽고 안전한 방법이 있습니까?
잘못된 액세스는 어디에서 발생합니까? 또한 ARC를 사용하고 있습니까? URL을 저장할 때 실제로 북마크 데이터를 가져 와서 저장하고 나중에 북마크 데이터를 읽은 다음 URL을 생성해야합니다. 또한 오디오 데이트는 실제로 여전히 있습니까? 임시 디렉터리는 언제든지 비울 수 있으며 파일이 실제로는 더 이상 존재하지 않을 수 있습니다 (특히 파일 크기가 클 경우). –
레코더에서 발생합니다. =이 프로젝트에서는 ARC를 사용하지 않습니다. 책갈피 데이터에 익숙하지 않습니다. 내 오디오 데이터가 아직 있는지 알아내는 것까지 실제로 얻지 못했습니다. 50 ~ 200 개의 짧은 오디오 파일을 녹음하고 원하는대로 액세스하려고합니다. URL이 정확히 왜 이전과 똑같은 지 알 수없는 이유는 무엇입니까? –
initWithURL을 가정합니다 : audioFile이 문제입니다. 틀릴 수도 있습니다. –