NSMutableArray не отвечает на селектор objectAtIndex - PullRequest
1 голос
/ 17 июня 2009

хорошо, я знаю, что я новичок в obj-c, но для всех намерений и целей следующее ниже SEEMS вроде как должно работать:

songCollection = [[NSMutableArray alloc] init];
    [songCollection addObject:@"test"];
    //Array is init, and I can see it in the debugger.
    songCollection = [GeneralFunctions getJSONAsArray:@"library"];
    // I can see the expected data in the debugger after this.
    [songCollection retain];
    NSLog(@"%@", [songCollection objectAtIndex:0]);
        // Crashes here due to the array not responding to the selector. Also, the array is now empty.
    //NSLog(@"%@", songCollection);
    NSArray * songList = [songCollection objectAtIndex:1];
    NSLog(@"%@", songList);

Я надеюсь, что кто-то может мне помочь, я бьюсь головой о стену!

Ответы [ 3 ]

8 голосов
/ 17 июня 2009

songCollection изначально был NSMutableArray, но затем вы перезаписали его тем, что возвращается из [GeneralFunctions getJSONAsArray:@"library"]. Что бы это ни было, это, вероятно, не массив.

Между прочим, здесь вы пропускаете массив.

7 голосов
/ 17 июня 2009

Давайте разберем ваш код шаг за шагом.

songCollection = [[NSMutableArray alloc] init];

Выделяет новый пустой NSMutableArray.

[songCollection addObject:@"test"];

Добавляет NSString @ "test" к NSMutableArray songCollection

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"];
1 голос
/ 17 июня 2009

Действительно ли [GeneralFunctions getJSONAsArray: @ "library"] действительно возвращает NSArray?

Вы также забыли выпустить songCollection, прежде чем переназначить ее с этой строкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...