【问题标题】:Objective C: Potential Memory Leak in code目标 C:代码中的潜在内存泄漏
【发布时间】:2011-06-08 03:19:36
【问题描述】:

我对我的代码运行了“分析”,结果显示我的代码的以下部分存在潜在的内存泄漏

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];

//Potential memory leak in code below
[[NSURLConnection alloc] initWithRequest:request delegate:self];

我不确定如何阻止这种泄漏。我试图在后面添加一个“自动释放”,但这导致了崩溃。对此有何建议?

编辑:

泄露消息截图

【问题讨论】:

    标签: objective-c memory-leaks


    【解决方案1】:

    在成功或失败时释放连接对象。它需要活到那个时候。所以在connection:didFailWithError:connectionDidFinishLoading: 委托方法中都放一个版本。只有一个会被调用。所以retain-release会平衡。

    【讨论】:

    • 嗨,Deepak,我按照您的建议做了,并在两种委托方法中添加了连接释放。但是我仍然收到内存泄漏消息。我已经用屏幕截图更新了我的查询。谢谢!
    • 虽然创建了连接对象,但并没有启动连接。要么使用initWithRequest:delegate:startImmediately: 并设置startImmediately:YES,要么将对象分配给一个变量,然后在其上调用start
    【解决方案2】:

    您对 NSURLConnection 的 alloc 调用返回一个引用计数为 1 的对象。您的代码应如下所示:

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    [connection start]; // This is optional.  It should begin the request after you alloc it
    

    处理完对象后,需要显式调用:

    [connection release];
    

    【讨论】:

      【解决方案3】:

      使用静态方法

      [NSURLConnection connectionWithRequest:request delegate:self];
      

      而不是

      [[NSURLConnection alloc] initWithRequest:request delegate:self];
      

      当然没有必要在它的委托方法中释放连接对象。

      或者如果你使用第二种方法,在两个委托方法中释放 NSURLConnection 对象:

      - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
      - (void)connectionDidFinishLoading:(NSURLConnection *)connection 
      

      并且可以忽略内存泄漏警告信息。

      【讨论】:

        猜你喜欢
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-19
        • 2011-10-16
        • 1970-01-01
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多