需要参考NSURLConnection?

时间:2012-11-26 05:54:29

标签: objective-c macos delegates

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

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

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

但问题是:这被认为是不好的风格吗?我应该始终使用这种对象关系维护一个实例变量吗?我将如何使用ARC工作?毕竟,当localVariable超出范围时,我认为ARC将取消分配NSURLConnection

1 个答案:

答案 0 :(得分:4)

我找不到这方面的官方参考,但似乎用NSURLConnection创建的initWithRequest保留了对自身的强引用,以防止它被解除分配。只有在调用最终委托函数或取消连接后,才会删除此引用。

(参见例如been having a little confusion about the retainCount of NSURLConnectionhttp://www.cocoabuilder.com/archive/cocoa/110116-nsurlconnection-retaincount-at-initialisation.html

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

这意味着您不必保持对连接的引用。但它很有用,因为它可以在必要时取消连接。