【问题标题】:Retain / Release mistake保留/释放错误
【发布时间】:2012-08-13 11:50:59
【问题描述】:

我试图弄清楚为什么我通过这段代码得到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”异常。

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

【问题讨论】:

    标签: ios exc-bad-access retaincount


    【解决方案1】:

    你释放了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 可以使用 Menu "Edit" ➞ "Refactor" ➞ "Convert to Objective-C ARC…" 几乎完全自动地转换您的项目。继续手动管理内存的原因很少。

    【讨论】:

    • 非常感谢。我现在意识到 a) 我正在创建一个我从不释放的字符串对象 b) 我正在释放我不拥有的数据对象。
    • 您使用的是哪个版本的 XCode?我使用的是 3.2.5,但在任何菜单中都没有看到 ARC......
    猜你喜欢
    • 2011-01-24
    • 2011-11-17
    • 1970-01-01
    • 2013-08-06
    • 2011-07-25
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多