NSURLConnection 启动 + 自动释放
Posted
技术标签:
【中文标题】NSURLConnection 启动 + 自动释放【英文标题】:NSURLConnection start + autorelease 【发布时间】:2011-08-12 08:36:42 【问题描述】:在我的应用程序中,我必须进行 HTTP 调用,并且我对来自 Web 服务的响应结果不感兴趣。所以我想知道是否可以创建一个连接并启动它并自动释放它不会导致内存泄漏。
NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:request delegate:nil];
[connection start];
[connection autorelease];
垃圾回收是否有可能在进行 HTTP 调用之前破坏连接对象?
【问题讨论】:
【参考方案1】:这是个好问题。即使没有明确说明 NSURLConnection 由操作系统保留,很明显连接请求被添加为运行循环的源,然后就这样被保留了。 在任何情况下,您最好通过
观察连接终止来为请求设置最小委托connectionDidFinishLoading:
然后释放您的连接对象,如文档的这一部分所述:
最后,如果连接成功下载请求,代理会收到 connectionDidFinishLoading: 消息。委托将不会再收到有关连接的消息并且可以释放 NSURLConnection 对象。
出于同样的原因,您应该观察到由于
错误导致的连接结束connection:didFailWithError:
。
【讨论】:
我知道正常的工作流要求在获取响应后释放连接。与代表团进行测试并不是一件确定的事情。只有否定的结果才是确定的。如果我通过自动释放的连接得到一些肯定的答案并不意味着可以这样做。 viggio,这是一个极好的答案! Akshay :谢谢 Teodor:这就是重点,委托方法是安全的,不使用委托可能会导致意外结果。【参考方案2】:您不需要服务器的响应是可以理解的。但是您不想确保已建立连接吗?如果连接超时怎么办?客户甚至不会知道错误。我觉得在确认请求到达服务器后释放连接实例比较好。
此外,在您的情况下不需要调用start
,因为您没有使用initWithRequest:delegate:startImmediately:
方法,而startImmediately
参数为NO。
【讨论】:
以上是关于NSURLConnection 启动 + 自动释放的主要内容,如果未能解决你的问题,请参考以下文章
使用 NSAutoreleasePool 和 NSURLConnection
如果 proxy.pac 下载失败,NSURLConnection 自动直接连接