0

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 泄漏?” 帖子和其他几个。我觉得我一定错过了一些非常明显的东西。帮助?

4

1 回答 1

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 是首选,因为由于 alloc 和 release 尽可能靠近,因此泄漏的可能性较小。此外,如果您忘记释放之前的连接,合成方法将为您释放之前的连接。不要忘记在 dealloc 中释放 self.connection。

于 2009-12-18T20:06:22.290 回答