【问题标题】:Should I release NSURLConnection instance variable?我应该释放 NSURLConnection 实例变量吗?
【发布时间】:2012-02-04 22:34:27
【问题描述】:

我正在使用NSURLConnection 类通过 Internet 获取一些数据,我的应用程序在某个时候崩溃了,我收到一个错误,表明我已经双重释放了一个对象,

以下是我如何创建NSURLConnection 的实例以及如何发布它:

NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
[connection release];

我应该在用完后释放它,对吗?还是在幕后发布?

编辑

现在我解决了这个问题,只是我将NSURLConnection的实例作为ivar并在dealloc中释放它,这是代码

头文件:

// ....
NSURLConnection *connection;

@property (nonatomic, retain) NSURLConnection *connection;

实现文件:

// ...
NSURLRequest *request = [NSURLRequest requestWithURL:url];
self.connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
// ...

-(void)dealloc{ 
    [connection release];
    [super dealloc];
}

问题是我在分配新连接之前没有释放旧连接,这是通过在 ivar 之前添加 self 来完成的。

【问题讨论】:

  • 考虑在您的项目中使用 ARC,它将有助于解决这种情况。
  • 我总是使用在 connectionDidFinish 加载或 connectionDidLoadWithError 中释放它(不确定确切的名称,但您必须有一个想法)...因为这两种方法都与您正在使用的当前连接有参数。 ..
  • 如果我设法在 didFinishLoading 和 didFinishWithErro 中释放它,你的意思是不需要在 dealloc 方法中释放它?谢谢

标签: objective-c ios cocoa-touch


【解决方案1】:

这将被立即释放和释放,因为 alloc/init 和释放是平衡的。

所以,不,这不是你想要的。

请提供更多关于connection 的代码。你在用它做什么。

您很可能希望将其写入属性并在 dealloc 中释放。

请确保您了解Management Rules。这是至关重要的。

【讨论】:

    【解决方案2】:

    如果您(显然)不使用 ARC,您有两种选择:

    a) 持有对连接的引用,并在适当的时候释放

    b) 你也可以在委托方法中释放连接 - 如果你这样做,分析器会给你警告

    第一个选项通常更容易维护,尤其是当您在一个对象中使用多个连接时。

    如果这是一个新项目,请考虑使用 ARC(正如 Richard J. Ross III 已经提到的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 2011-03-21
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      相关资源
      最近更新 更多