保留/释放错误

时间:2012-08-13 11:51:00

标签: ios exc-bad-access retaincount

我想弄清楚为什么我会通过此代码获得EXC_BAD_ACESS。我没有clu。任何人都可以帮助我。

- (void)loadJsonFile:(NSString*)fileName {
    NSError *error = nil;
    NSData *jsonData = [[[NSString alloc]
                         initWithContentsOfFile:[[NSBundle mainBundle]
                                                 pathForResource:fileName ofType:@"json"]
                         encoding:NSUTF8StringEncoding error:&error]
                        dataUsingEncoding:NSUTF8StringEncoding];
    
    jsonDic = [[NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error] retain];
   [jsonData release];
}

如果我正在评论“[jsonData release];”行,那么一切正常。但为什么 ?我分配jsonData,用数据填充它并将其传递给NSJSONSerialization以获取jsonDic。在我进行序列化之后,我发布jsonData并想要使用jsonDic,但是在“[jsonData release];”之后的一段时间我得到“EXC_BAD_ACCESS”异常。

我没有任何帮助,感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您发布jsonData,但您从未保留过它。静态分析器(菜单"Product" ➞ "Analyze")会向您显示此问题。此外,您还没有发布您正在分配的NSString

这样做:

- (void)loadJsonFile:(NSString*)fileName {
    NSError *error = nil;
    NSData *jsonData = [[[[[NSString alloc]
                         initWithContentsOfFile:[[NSBundle mainBundle]
                                                 pathForResource:fileName ofType:@"json"]
                         encoding:NSUTF8StringEncoding error:&error] autorelease]
                        dataUsingEncoding:NSUTF8StringEncoding] retain];

    jsonDic = [[NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error] retain];
    [jsonData release];
}

您可能需要考虑使用ARC(自动引用计数)。 Xcode可以使用菜单"Edit" ➞ "Refactor" ➞ "Convert to Objective-C ARC…"几乎完全自动转换您的项目。手动管理内存的原因很少。