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