objective-c - 需要引用 NSURLConnection 吗?

标签 objective-c macos delegates

我可以在 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 NSURLConnectionhttp://www.cocoabuilder.com/archive/cocoa/110116-nsurlconnection-retaincount-at-initialisation.html)

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

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

关于objective-c - 需要引用 NSURLConnection 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13559367/

相关文章:

c# - 为可用于 C# 回调的 C++ dll 函数创建包装器

ios - 执行命令,didRegisterForRemoteNotificationsWithDeviceToken 与 didFinishLaunchingWithOptions

iphone - 在多个矩形中绘制一个 NSString

objective-c - 在 OS X Lion 中,向 Finder 询问当前选择,返回错误的文件

macos - 如何从Mac终端打开emacs gui/ide?

swift - AlamofireImage:是否可以在 Swift 中从 NSimageview 获取原始数据?

objective-c - 桥接头是否有可能将 (void (^)(NSError *))block (ObjC) 变成 block : () throws -> () (Swift)?

objective-c - 异步闭包在 Swift 中是如何工作的

macos - 如何使虚线可移动

c# - 我应该为移动客户端/服务器对象使用哪种C#类模式