NSURLConnection是否保留其委托?

Ian*_*Ian 23 iphone memory-management objective-c

我的问题摘要:NSURLConnection是否保留其代理人?

详细问题和场景:

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

在iPhone应用程序上,我做了类似的事情.(init方法启动整个过程)

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

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

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

所以我的问题是这样:什么让JsonDownloader保持超越事件周期的结束?我明确地发布了它.

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

Dav*_*ana 25

没有很多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]);
Run Code Online (Sandbox Code Playgroud)

在日志中产生:

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.
Run Code Online (Sandbox Code Playgroud)

所以你可以清楚地看到,connectionWithRequest:delegate:"自我"的保留计数确实增加了+1.如果你觉得自己很勇敢并且想要使用EXC_BAD_ACCESS诸神,请加入

[conn dealloc];
NSLog(@"Retain count after dealloc: %d", [self retainCount]);
Run Code Online (Sandbox Code Playgroud)

这将再次打印出"1",显示后dealloc减少.但是,你会得到一个很好的,Program received signal: “EXC_BAD_ACCESS”.因为NSAutoreleasePool它将尝试释放连接,它将消失;)


drv*_*ijk 9

大多数委托属性不会保留,但会分配以防止循环引用.也可以看到这个问题.

但是,NSUrlConnection没有特定的委托属性.您必须指定委托以及连接的初始化.Dave Martorana表示,我认为这就是为什么它会得到保留.


ma1*_*w28 7

是的,"连接保留委托.它在连接完成加载,失败或被取消时释放委托" ,-[NSURLConnection initWithRequest:delegate:]根据特殊注意事项下的Xcode文档.另请参见:NSURLConnection固有的内存泄漏?