释放内存的正确方法是什么?

3

我在Objective C方面是个新手,目前遇到下面代码片段中的内存泄漏问题。在执行'responseObj'分配时出现内存泄漏。每当我试图像responseData一样释放它时,就会崩溃。

-(void) connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSString* responseStr = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    NSMutableArray* responseObj = [responseStr objectFromJSONString];
    [delegate loadGameDetails:[responseObj objectForKey:@"result"]];
    [responseStr release];

    [responseData release]; responseData = nil; 
}

我也试过自动释放,但还是会崩溃:

[delegate loadGameDetails:[[responseObj objectForKey:@"result"] autorelease]];

我应该如何正确释放这块内存?

2个回答

2
问题不在于你的分配。你正在将objectForKey:发送到一个NSMutableArray,这实际上是一个NSDictionary/NSMutableDictionary方法。仔细检查objectFromJSONString返回的对象类型。

不错,我在寻找漏洞时没注意到这个! - jrturton
我注意到你正在释放responseData,但我没有看到它在哪里或如何分配? - gschandler

1

那段代码中没有泄漏。你可能过度释放了responseData,但我无法确定,因为它的声明和设置不在范围内。如果它是一个实例变量,你通常会通过访问器将其设置为nil(这将在那里释放它),而不是像你在这里直接释放。

如果有泄漏,那就在你的loadGameDetails方法中。你怎么知道你有内存泄漏?你是否通过工具运行了它,或者使用了静态分析器?


请编辑问题并包含代码,不要将代码放在评论中,因为这样很难阅读! - jrturton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接