2014-01-13 103 views
-1

我试图记录一个音频,并保存每个录制音频的路径在数组中。我使用这个代码保存音频:NSMutableArray不存储元素

(IBAction)AudioRecord:(id)sender { 
[self.AudioRecorder record]; 

NSURL *audioFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingString:@"audioRecording.m4a"]]; 
self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioFileURL error:nil]; 

NSUserDefaults *audioDefaults= [NSUserDefaults standardUserDefaults]; 
[audioDefaults setURL:audioFileURL forKey:@"saveAudio"]; 
[audioDefaults synchronize]; 

NSUserDefaults *defaultsAudio=[NSUserDefaults standardUserDefaults]; 
NSUserDefaults *defaultsForArrayA =[NSUserDefaults standardUserDefaults]; 
NSMutableArray *AudioArray =[[NSMutableArray alloc]init]; 
AudioArray =[defaultsForArrayA arrayForKey:@"myAudio"]; 
NSString *Audiopath=[audioFileURL path]; 
[AudioArray addObject:Audiopath]; 
defaultsAudio=defaultsForArrayA; 
[defaultsAudio setObject:AudioArray forKey:@"myAudio"]; 
[defaultsAudio synchronize]; 



if (AudioArray.count==0) 

    [email protected]"nothing"; 
else 
    _check.text=[NSString stringWithFormat:@"%lu", (unsigned long)AudioArray.count]; 

我使用if语句只是检查的对象被保存在数组中。但事实证明什么都没有被保存!

当我删除此行:

AudioArray =[defaultsForArrayA arrayForKey:@"myAudio"]; 

阵列工作。但我需要这条线。

+1

首先,名称变量以小写字母开头。其次,当你做'defaultsAudio = defaultsForArrayA;'时,你用'defaultsAudio = [NSUserDefaults standardUserDefaults];'覆盖你获取的值。第三,当你做'AudioArray = [defaultsForArrayA arrayForKey:@“myAudio”];'你用'AudioArray = [[NSMutableArray alloc] init];'覆盖你设置的值。 –

+1

检查AudioArray是否为零(nil.count将== 0)。我的猜测是'[defaultsAudio setObject:AudioArray forKey:@“myAudio”];'返回nil,而不是填充或空白的NSMutableArray。 – ansible

+0

@ansible ooh是的,它是零! – user3191725

回答

2

更改这些行:

NSMutableArray *AudioArray =[[NSMutableArray alloc]init]; 
AudioArray =[defaultsForArrayA arrayForKey:@"myAudio"]; 

AudioArray =[[defaultsForArrayA arrayForKey:@"myAudio"] mutableCopy]; 
if (!AudioArray) { 
    AudioArray =[[NSMutableArray alloc]init]; 
} 

目前,您要添加对象非可变的NSArray。请注意,在这些行中:

NSMutableArray *AudioArray =[[NSMutableArray alloc]init]; 
AudioArray =[defaultsForArrayA arrayForKey:@"myAudio"]; 

您首先将一个空的NSMutableArray分配给AudioArray。然后你在第二行分配一个不同的值,并用NSArray覆盖第一个值。

+0

不工作:(任何其他建议? – user3191725

+0

@JoshCaswell在这里是正确的,因为从defaultsForArrayA返回的数组可能返回nil,因此不会抛出异常,但我的答案仍然是您将面临的另一个问题 – stackunderflow

+0

@ user3191725我已经更新了我的答案,以便为你解决这两个问题 – stackunderflow

-1

问题是[defaultsAudio setObject:AudioArray forKey:@"myAudio"];将AudioArray设置为零。所以它会默默地忽略任何呼叫,包括添加新项目。并且当nil时AudioArray.count == 0。

它没有这个调用的原因是因为你正在初始化它NSMutableArray *AudioArray =[[NSMutableArray alloc]init];之上,它将返回一个空的NSMutableArray你可以添加对象。

一个解决方案(如果您不能修改setObject:forKey :)是使用临时数组并将其合并到AudioArray中。

NSMutableArray *temp; 
temp =[defaultsForArrayA arrayForKey:@"myAudio"]; 
AudioArray = [[NSMutableArray alloc] initWithArray:temp]; 

所以它会工作,如果它返回nil,空白数组或填充数组。