2012-09-29 3 views
0

오디오 녹음 파일 주소를 배열에 저장하고 나중에 사용하는 데 문제가 있습니다. 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) 

누구나이 상황을 어떻게 극복 할 수 있는지 알고 있습니까? 또한 더 쉽고 안전한 방법이 있습니까?

+0

잘못된 액세스는 어디에서 발생합니까? 또한 ARC를 사용하고 있습니까? URL을 저장할 때 실제로 북마크 데이터를 가져 와서 저장하고 나중에 북마크 데이터를 읽은 다음 URL을 생성해야합니다. 또한 오디오 데이트는 실제로 여전히 있습니까? 임시 디렉터리는 언제든지 비울 수 있으며 파일이 실제로는 더 이상 존재하지 않을 수 있습니다 (특히 파일 크기가 클 경우). –

+0

레코더에서 발생합니다. =이 프로젝트에서는 ARC를 사용하지 않습니다. 책갈피 데이터에 익숙하지 않습니다. 내 오디오 데이터가 아직 있는지 알아내는 것까지 실제로 얻지 못했습니다. 50 ~ 200 개의 짧은 오디오 파일을 녹음하고 원하는대로 액세스하려고합니다. URL이 정확히 왜 이전과 똑같은 지 알 수없는 이유는 무엇입니까? –

+0

initWithURL을 가정합니다 : audioFile이 문제입니다. 틀릴 수도 있습니다. –

답변

1

표시되는 코드는 여기에 예외가 발생하지 않기 때문에 완전히 관련이 없습니다. 예외는 아마도 메모리 관리 오류로 인한 것이므로 NSURL과 아무 관련이 없습니다. 당신은 단지 그것에 대해 추측하고 있습니다. 그리고 그렇게해서는 안됩니다.

코드에 메모리 관리가 없으며 ARC를 사용하지 않기 때문에 메모리 관리 책임을 인식하지 못했음을 나타냅니다. 내 책은 당신에게 설명하고, 또한 당신이 할 수있는 경우는 ARC를 사용해야하는 이유에 대해 설명합니다

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

또한

는, 정적 분석기를 사용; 그것은 메모리 관리의 위험 징후 중 일부를 발견 할 것입니다.

+0

알겠습니다. 의심 할 여지없이, 책임감있는 코딩에 대해 배워야 할 필요가 있습니다. 이것은 현재 프로토 타입에 있으며,이 프로젝트가 실제로 가치가 있다고 생각할 때 다시 시작하여 ARC를 사용하려고합니다. 이 문제를 해결하기 위해 내가 이것을 넣으면 모든 것이 잘 작동합니다 : audioFile = [NSURL fileURLWithPath :. . . . : 녹음기 = [[. . . 선. 그러나 NSLog는 다시 똑같이 나타납니다. –

+1

프로토 타입을 작성하는 경우에도 메모리 관리를 무시할 필요가 없습니다. 목표 -C는 그런 종류의 언어가 아닙니다. 지금까지 NSURL이 붉은 청어라고 생각할 이유가 없습니다. – matt

+0

좋아요, 나는 ANALYZE를 실행했고 이것을 얻었습니다 : .../record_audio_testViewController.m : 292 : 9 : Object leaked : 'recordSetting'에 할당되고 저장된 객체는 나중에이 실행 경로에서 참조되지 않고 + 1의 보유 수를 가짐 –

관련 문제