NSMutableArrayはobjectAtIndexセレクタに応答しません

iphone nsmutablearray objective-c

大丈夫、私はobj-cに慣れていないことを知っていますが、すべての意図と目的のために、以下のSEEMSはうまくいくはずです。

songCollection = [[NSMutableArray alloc] init]; [songCollection addObject:@ "test"]; // Arrayはinitで、デバッガで見ることができます。 songCollection = [GeneralFunctions getJSONAsArray:@ "library"]; //この後、デバッガで予想されるデータを見ることができます。 [songCollection保持]; NSLog(@ "%@"、[songCollection objectAtIndex:0]); //配列がセレクタに応答しないため、ここでクラッシュします。 また、配列は空になりました。 // NSLog(@ "%@"、songCollection); NSArray * songList = [songCollection objectAtIndex:1]; NSLog(@ "%@"、songList);

私は誰かがここで私を助けることができると思います、私は壁に頭をぶつけています!

  1  1


ベストアンサー

`+ songCollection `は元々NSMutableArrayでしたが、 ` [GeneralFunctions getJSONAsArray:@” library “] +`から返されるもので上書きしました。 それが何であれ、おそらくそれは配列ではありません。

ちなみに、あなたはここで配列をリークしています。

8


コードを少しずつ分解していきましょう。

songCollection = [[NSMutableArray alloc] init];

新しい空のNSMutableArrayを割り当てます。

[songCollection addObject:@"test"]
;

NSMutableArrayのsongCollectionにNSString @ “test”を追加します。

songCollection = [GeneralFunctions getJSONAsArray:@ "library"];

作成した可変配列への参照を破棄し(したがってメモリがリークします)、まだ所有していないものへの新しいポインタを提供します。

[songCollection retain]
;

いいですね、あなたはsongCollectionの所有権を取得します。 これでうまくいくので、あなたはgetJSONAsArrayがnilかNSObjectを返したことを知っています。

NSLog(@ "%@"、[songCollection objectAtIndex:0]);
// Crashes here due to the array not responding to the selector. Also, the array is now empty.

そのため明らかにsongCollectionはnilでもNSArrayでもない(可変であるかそうでない)。 GeneralFunctions getJSONAsArrayのドキュメントまたは署名を調べて、実際に返されるものを確認してください。

//NSLog(@"%@", songCollection);

この出力は何をしていますか – それはあなたにsongCollectionが実際には何であるかを教えてくれるはずです。

getJSONAsArrayがNSArrayを返さない理由を理解したと仮定すると、NSArrayをNSMutableArrayに変換できます。

songCollection = [[GeneralFunctions getJSONAsArray:@ "library"] mutableCopy];
// You now own songCollection

または

songCollection = [[NSMutableArray alloc] init];
// You now own songCollection
[songCollection addObjectsFromArray:[GeneralFunctions getJSONAsArray:@"library"]
;

7


[GeneralFunctions getJSONAsArray:@ “library”]は実際にはNSArrayを返しますか?

また、その行に割り当てる前にsongCollectionを解放するのを忘れています。

1


タイトルとURLをコピーしました