NSURLConnection泄漏 - 为什么?

时间:2009-11-08 20:06:27

标签: nsurlconnection

NSURLConnection * connection是类

的属性
@property (nonatomic, retain) NSURLConnection *connection;

Instruments报告我在下面代码的第二行泄漏了一个NSURLConnection对象。

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:_url];
self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[request release];

didFinishLoadingdidFinishWithError委托选择器中,我将释放连接并设置为nil

[self.connection release];
self.connection = nil;

我已阅读"NSURLConnection leak?"帖子和其他几篇文章。我觉得我必须错过一些非常明显的东西。帮助

1 个答案:

答案 0 :(得分:3)

正如roe的评论所说,你正在分配连接(保留计数1),然后再用你的连接属性保留它(保留计数2)。您只在委托选择器中释放一次。您有两种选择:

1)更改您的连接属性以分配而不是保留。

@property (nonatomic, assign) NSURLConnection *connection;

// OR, since assign is the default you may omit it

@property (nonatomic) NSURLConnection *connection;

2)在连接属性保留分配的对象后释放它:

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:_url];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
self.connection = connection;
[connection release];
[request release];

选项2是首选,因为泄漏的可能性较小,因为分配和释放尽可能接近。此外,如果您忘记释放先前的连接,则合成方法将为您释放前一个连接。不要忘记在dealloc中释放self.connection。