访问时,NSArray会崩溃应用程序

时间:2012-05-10 18:24:22

标签: objective-c crash nsarray

从使用CFPreferencesCopyAppValue()方法返回的NSArray访问/设置对象时遇到问题。我的应用程序在这种情况下崩溃,而当我自己分配/初始化时,一切都运行良好。

 CFArrayRef cfArray;
    if ((cfArray = (CFArrayRef)CFPreferencesCopyAppValue(CFSTR("buttonsOrder"), appID))) {
        NSArray *castedArray = [(NSArray *)cfArray retain];
        NSLog(@"castedArray : %@", castedArray);
        buttonsOrder = [castedArray mutableCopy];
        NSLog(@"buttonsOrder : %@", buttonsOrder);
        CFRelease(cfArray);
        [castedArray release];
        castedArray = nil;
    }
    else {
        buttonsOrder = [[NSMutableArray alloc] init];
        for (NSMutableDictionary *info in togglesInfo) {
            [buttonsOrder addObject:[info objectForKey:@"buttonIdentifier"]];
        }
    }

PS:NSLog()向我展示CFArray返回的很好,并且很好地转换为NSArray,然后是NSMutableArray。

有什么想法吗?

编辑:

以下是我修改数组的方法:

- (void) tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
NSUInteger fromIndex = [fromIndexPath row];
NSUInteger toIndex = [toIndexPath row];
if (fromIndex == toIndex)
    return;
NSString *movedButtonId = [[[buttonsOrder objectAtIndex:fromIndex] retain] autorelease];
[buttonsOrder removeObjectAtIndex:fromIndex];
[buttonsOrder insertObject:movedButtonId atIndex:toIndex];

}

1 个答案:

答案 0 :(得分:0)

如果在尝试对象添加到可变数组时崩溃,通常意味着您正在尝试添加nil对象。我看到你在你的可变数组中添加任何内容的唯一地方(在上面的代码片段中)是你没有从CFPreferences获得有效的“cfArray”。你应该确保“[info objectForKey:@"buttonIdentifier"]”没有返回nil。

检查以确保您没有抛出异常。或者如果不是这样,请说明你的崩溃究竟是什么(它会在Xcode的控制台日志中说明。)