应用程序崩溃插入对象到数组

时间:2010-07-08 08:38:27

标签: objective-c iphone

这是代码

NSString* favPlistPath = [[NSBundle mainBundle] pathForResource:@"favs" ofType:@"plist"];
NSMutableDictionary* favPlistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:favPlistPath];

favArray = [[NSMutableArray alloc] initWithCapacity:100];
for(int i=0; i<[favPlistDict count]; i++)
{
    //app is crashing here
    [favArray insertObject:[favPlistDict objectForKey:[NSNumber numberWithInt:i]] atIndex:i];
}

在我的favs.plist文件中有单个输入键:0值:5

2 个答案:

答案 0 :(得分:1)

如果字典中不存在该键,则

-objectForKey:返回nil。然后,当您尝试将对象添加到数组时,会抛出异常,因为您无法将nil添加到Cocoa集合中。

如果您想要值为零的占位符,则必须使用[NSNull null]

favArray = [[NSMutableArray alloc] init]; 
// the capacity in initWithCapacity: is just a hint about memory allocation, I never bother.

for(int i=0; i<[favPlistDict count]; i++)
{
    id value = [favPlistDict objectForKey:[NSNumber numberWithInt:i]];
    if (value == nil)
    {
        value = [NSNull null];
    }
    [favArray addObject:value]; // adds the object to the end of the array
}

以上情况仅适用于favPListDict中的键是从0到某个值的连续数字的情况。

答案 1 :(得分:0)

您没有从词典中正确获取值。在这些情况下,更好的方法是简单地枚举字典中的键,而不是循环并希望每个数字都有一个值。我也有一种感觉你有NSStrings,而不是NSNumbers,这就是你得到nils的原因。

for (NSString *k in favPlistDict) {
    [favArray addObject:[favPlistDict objectForKey:k]];
}

在这里,你要添加一个对象,而不是使用insertObject:atIndex:但是因为你从0开始插入,所以addObject:反正可能更好。