NSURLConnection 是不是保留其委托?

Posted

技术标签:

【中文标题】NSURLConnection 是不是保留其委托?【英文标题】:Does a NSURLConnection retain its delegate?NSURLConnection 是否保留其委托? 【发布时间】:2010-11-09 06:25:30 【问题描述】:

我的问题总结:NSURLConnection 是否保留它的委托?

详细的问题和场景:

我有一个名为 JsonDownloader 的自定义类,它接收一个 URL 并返回 URL 返回的 JSON 的 NSDictionary。

在 iPhone 应用程序上,我会做这样的事情。 (init方法启动整个过程)

- (void)viewDidLoad 
    JsonDownloder *temp = [[[JsonDownloader alloc] initWithURL:urlString returnDataTo:self]];
    [temp release];
    [super viewDidLoad];

当 JsonDownloader 完成下载和解析后,它会回调 returnDataTo: 对象,在本例中为调用对象。

这很好用。即使我在 Web 服务器响应中引入了 30 秒的延迟,JsonDownloader 仍然存在并且它的回调是否正确。

所以我的问题是:是什么让 JsonDownloader 超过了事件周期的结束?我明确地释放它。

我的预感是 NSURLConnection 必须对其委托进行保留,但我在文档中没有看到任何内容。有人有想法吗?

【问题讨论】:

【参考方案1】:

是的,根据特殊注意事项下的Xcode Documentation for -[NSURLConnection initWithRequest:delegate:],“连接保留委托。它在连接完成加载、失败或取消时释放委托”。另见:NSURLConnection inherent memory leak?

【讨论】:

好的,这是关于 NSURLConnection 的“注释”。仍然应该在方法描述中提到它,因为它相当重要。【参考方案2】:

大多数委托 属性 不保留,而是分配以防止循环引用。请参阅 this 问题。

但是,NSUrlConnection 没有特定的委托属性。您必须指定委托以及连接的初始化。我认为这就是为什么它确实获得了保留,正如 Dave Martorana 所展示的那样。

【讨论】:

【参考方案3】:

没有多少 setter 不复制或保留传递给它的变量,以免该变量的内存在其保留计数达到零时被重新分配给其他东西。

但是,答案是肯定的,确实如此。一点测试代码显示委托的保留计数上升:

NSLog(@"Retain count before: %d", [self retainCount]);
NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]];
NSURLConnection* conn = [NSURLConnection connectionWithRequest:request delegate:self];
NSLog(@"Retain count after: %d", [self retainCount]);

在日志中产生:

Running…
2009-07-09 02:13:40.516 delegateRetain[45123:a0f] Retain count before: 1
2009-07-09 02:13:40.525 delegateRetain[45123:a0f] Retain count after: 2

Debugger stopped.

所以你可以很清楚地看到connectionWithRequest:delegate:“self”的保留计数确实增加了+1。如果你觉得很勇敢,想和 EXC_BAD_ACCESS 诸神混在一起,请加入

[conn dealloc];
NSLog(@"Retain count after dealloc: %d", [self retainCount]);

这将再次打印出“1”,显示释放后减量。但是,您会得到一个不错的Program received signal: “EXC_BAD_ACCESS”.,因为NSAutoreleasePool 会尝试释放连接,但它会消失;)

【讨论】:

好问题和好答案。我自己也在为此苦苦挣扎,但我决定在委托分配后立即添加 [self release] 以平衡保留计数。由于 self 在我的班级中是代表,我认为没有理由增加其保留计数。如果这不正确,请告诉我。 我只是想补充一下——谢谢。缺失的手册,第 327 部分。令人难以置信的是,Apple 文档中没有提到这种重要的事实。我认为它保留了它,但不确定,文档对此只字未提,而且在许多(如果不是大多数)情况下,Cocoa 框架中的委托没有保留。这是个例外。

以上是关于NSURLConnection 是不是保留其委托?的主要内容,如果未能解决你的问题,请参考以下文章

NSURLConnection 委托方法未执行 [关闭]

如何从 NSURLConnection 委托发送多个 url 请求?

NSURLConnection(作为 AFNetworking 的一部分)不调用 NSURLConnectionDataDelegate 委托

在 Apple 的开发人员文档中找不到所需的 NSURLConnection 委托方法。为啥?

如何使用 NSURLConnection (NSMutableRequest) 超时

https 上的 NSURLConnection 同步请求