1

好的,我知道我是 obj-c 的新手,但出于所有意图和目的,以下似乎应该可以工作:

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);

我希望有人可以在这里帮助我,我正在用头撞墙!

4

3 回答 3

8

songCollection最初是一个 NSMutableArray,但后来你用从[GeneralFunctions getJSONAsArray:@"library"]. 不管那是什么,它可能不是一个数组。

顺便说一句,您在这里泄漏了一个数组。

于 2009-06-17T02:28:34.803 回答
7

让我们一步一步地拆开你的代码。

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 既不是零,也不是 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"];
于 2009-06-17T05:20:42.673 回答
1

[GeneralFunctions getJSONAsArray:@"library"] 实际上返回一个 NSArray 吗?

您还忘记在重新分配该行之前释放 songCollection。

于 2009-06-17T02:27:37.710 回答