2014-01-13 59 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,空白數組或填充數組。