我可以在NSURLConnection
中创建一个带有异步请求的applicationDidFinishLaunching:
对象,而不是在实例变量中保留对它的引用,如下所示?
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
NSURLConnection *localVariable = [[NSURLConnection alloc] initWithRequest:req delegate:self];
}
我相信这不应该使用ARC。虽然我不再对NSURLConnection
对象有任何引用,但是它应该完成它的工作并且在我用它的一个委托方法(例如connectionDidFinishLoading:
)中释放它之前不会被释放,因为它会离开applicationDidFinishLaunching:
保留计数为+1,对吧?
但问题是:这被认为是不好的风格吗?我应该始终使用这种对象关系维护一个实例变量吗?我将如何使用ARC工作?毕竟,当localVariable
超出范围时,我认为ARC将取消分配NSURLConnection
。
答案 0 :(得分:4)
我找不到这方面的官方参考,但似乎用NSURLConnection
创建的initWithRequest
保留了对自身的强引用,以防止它被解除分配。只有在调用最终委托函数或取消连接后,才会删除此引用。
(参见例如been having a little confusion about the retainCount of NSURLConnection或http://www.cocoabuilder.com/archive/cocoa/110116-nsurlconnection-retaincount-at-initialisation.html)
因此,您的代码也适用于ARC:即使localVariable
超出范围,只要连接处于“活动状态”,就会有另一个连接引用。
这意味着您不必保持对连接的引用。但它很有用,因为它可以在必要时取消连接。