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