2

我可以在 中创建一个NSURLConnection带有异步请求的对象applicationDidFinishLaunching:,而不是在实例变量中保留对它的引用,如下所示?

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    NSURLConnection *localVariable = [[NSURLConnection alloc] initWithRequest:req delegate:self];
}

我相信这在不使用 ARC 时应该可以工作。虽然我不再对该NSURLConnection对象有任何引用,但它应该完成它的工作并且不会被释放,直到我在它的一个委托方法中释放它,比如connectionDidFinishLoading:,因为它applicationDidFinishLaunching:的保留计数为 +1,对吧?

然而,问题是:这被认为是不好的风格吗?我是否应该始终维护具有这种对象关系的实例变量?我该怎么做才能使这项工作与 ARC 一起使用?毕竟,当localVariable超出范围时NSURLConnection,我想 ARC 会释放 my 。

4

1 回答 1

4

我找不到这方面的官方参考,但似乎NSURLConnectioncreate withinitWithRequest对自身保持了强烈的引用,以防止它被释放。只有在调用最终委托函数或取消连接后才会删除此引用。

(参见例如对 NSURLConnection 的 retainCount或http://www.cocoabuilder.com/archive/cocoa/110116-nsurlconnection-retaincount-at-initialisation.html有一点困惑

因此,您的代码也适用于 ARC:即使localVariable超出范围,只要连接处于“活动状态”,就会有另一个对连接的引用。

这意味着您不必保留对连接的引用。但它很有用,因为它使您能够在必要时取消连接。

于 2012-11-26T09:04:41.210 回答