Давайте разберем ваш код шаг за шагом.
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"];