0

我试图弄清楚为什么我会得到EXC_BAD_ACESS 这段代码。我没有头绪。任何人都可以帮助我吗?

- (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”异常之后的一段时间。

我不知道,任何帮助表示赞赏。

4

1 回答 1

2

你 release jsonData,但你从未保留它。静态分析器 (Menu "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 可以使用 Menu 几乎完全自动地转换您的项目"Edit" ➞ "Refactor" ➞ "Convert to Objective-C ARC…"。继续手动管理内存的原因很少。

于 2012-08-13T12:09:41.160 回答