【问题标题】:Proper way to release memory allocation?释放内存分配的正确方法?
【发布时间】:2012-01-22 12:15:24
【问题描述】:

当谈到目标 C 时,我是一个新手,并且目前正在经历以下代码 sn-p 的内存泄漏。内存泄漏发生在“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]];

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

【问题讨论】:

    标签: iphone objective-c cocoa-touch memory-management ios4


    【解决方案1】:

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

    【讨论】:

    • 好地方,我一直在寻找漏洞,但没有注意到!
    • 我刚刚注意到你发布了responseData,但我不知道它是在哪里或如何分配的?
    【解决方案2】:

    该代码中没有任何内容泄漏。您可能会过度释放 responseData 但我无法确定,因为它的声明和设置不在范围内。如果它是 ivar,您通常会通过访问器(将在此处释放它)将其设置为 nil,而不是像您在此处所做的那样直接设置。

    如果有泄漏,它是在您的 loadGameDetails 方法中。是什么让你认为你有内存泄漏?您是否通过仪器运行过,或使用过静态分析仪?

    【讨论】:

    • 编辑问题以包含它,不要将代码放在 cmets 中,因为它很难阅读!
    猜你喜欢
    • 2021-04-21
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多