2012-03-15 12 views
1

配列にオブジェクトを追加しようとするとクラッシュする問題があります。オブジェクトを作成してリリースする方法に問題があると思います。しかし、私はまだメモリ管理に少し弱いので、私はまだよく分からない。辞書を辞書に追加すると、プログラムがクラッシュしますか?

NSMutableDictionary *schools = [[NSMutableDictionary alloc] init]; 
    [schools setObject:name forKey:kFavoriteSchoolName]; 
    //load data is getting data from NSUserDefault which I save 
    NSMutableArray *loadedArray = [self loadData]; 

//if loadedarray has object in there, then continue adding schools to it or make new array 
if([loadedArray count] > 0) 
{ 
    [loadedArray addObject:schools]; 

    > // it crashes here 


    [schools release]; 

    return loadedArray; 
} else 
{ 

    //It will add the school to the array for the first time if there is nothing when it loaded. 

    NSMutableArray *tempArray = [[[NSMutableArray alloc] init] autorelease]; 
    [tempArray addObject:schools]; 

    [schools release]; 

    return tempArray; 
} 

この機能はお気に入りのリストに追加するのに役立ちます。一度追加することはできませんが、もう一度追加するとクラッシュします。

これはloaddataの機能の私のコードです

- (NSMutableArray *) loadData 
{ 
   NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults]; 
    
   NSMutableArray *list = [userDefault objectForKey:kSchoolList]; 
    
   return list; 
    
} 

ログは、この何でも言っていない:スレッド1:プログラムは、信号「SGABRT」

私が最初のプログラムを実行し、追加し、それを受け取りました私は再び学校を追加し、クラッシュするだけで、[loadedArray addobject:schools]でクラッシュします。

+1

にデータを移入? – Madhu

+1

NSMutableArray * loadedArray = [self loadData]; '[self loadData]'によって返される配列も変更可能であることを確認してください...もう一度これを行い、 'NSMutableArray * loadedArray = [[self loadData] mutable copy]; ' – Shubhank

+0

このNSMutableArrayを試してください* loadedArray = [[NSMutableArray alloc] initWithArray:[self loadData]]; –

答えて

1

コードは明らかです。白い唯一の点は、[self loadData]メソッドで配列を作成する方法です。

あなたはNSUserDefaultsから復元すると述べました。おそらくあなたは[[NSUserDefaults standardUserDefaults] objectForKey:@"schools"]でそれを返すでしょう。

objectForKey:方法はid型オブジェクトを返すので、あなたがそのobjectForKey:戻りNSArrayないNSMutableArrayを知らせる警告を得ることはありません。あなたはログを置く場合

0

はそれが役立つだろう)ので、私たちはどのようなクラッシュを知っているよ。

return [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"schools"]]; 


私は私はあなたのコードの権利を推測願っています:

はちょうどこのような何かを作ります実際には。私はあなたがtempArrayの値をロードしていることを、ある時点で想定しています。私はあなたがあなたの配列loadArrayを初期化していないことが判明、この

NSMutableDictionary *schools = [[NSMutableDictionary alloc] init]; 
    [schools setObject:name forKey:kFavoriteSchoolName]; 
    //load data is getting data from NSUserDefault which I save 
    NSMutableArray *loadedArray = [[self loadData] retain]; 

//if loadedarray has object in there, then continue adding schools to it or make new array 
if([loadedArray count] > 0) 
{ 
    if([loadedArray isKindOfClass:[NSMutableArray class]]) { 
    [loadedArray addObject:schools]; 
    } 
    else {NSLog(@"Not a mutable array");} 

    > // it crashes here 


    [schools release]; 

    return [loadedArray autorelease]; 
} else 
{ 
    [loadedArray release]; 
    //It will add the school to the array for the first time if there is nothing when it loaded. 

    NSMutableArray *tempArray = [[[NSMutableArray alloc] init] autorelease]; 
    [tempArray addObject:schools]; 

    [schools release]; 

    return tempArray; 
} 
+0

速い返信ありがとう、私はちょうど私の質問を編集しました。もう一度見て、私を助けてください。 – user1035877

0

にコードを変更してみてください。 は、初期化されていないNSMutableArrayに値を追加できません。

初期化を開始する必要があります。

NSMutableArray *loadArray = [[NSMutableArray alloc]init]; 

次にあなたがクラッシュログを投稿できる、あなたの配列

[loadArray addObjectsFromArray:[self loadData]]; 
関連する問題