gpt4 book ai didi

objective-c - NSURLConnection 是否保留其委托(delegate)?

转载 作者:太空狗 更新时间:2023-10-30 03:11:56 25 4
gpt4 key购买 nike

我的问题总结:NSURLConnection 是否保留其委托(delegate)?

详细问题和场景:

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

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

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

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

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

所以我的问题是:是什么让 JsonDownloader 一直坚持到事件周期结束之后?我明确释放它。

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

最佳答案

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

然而,答案是肯定的,确实如此。一些测试代码显示委托(delegate)的保留计数上升:

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”,显示 dealloc 后减量。然而,你会得到一个很好的Program received signal: “EXC_BAD_ACCESS”。 因为NSAutoreleasePool 会尝试释放连接,然后它就会消失;)

关于objective-c - NSURLConnection 是否保留其委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1101867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com