NSURLConnection仍然调用委托AFTER取消方法被调用
如果我创建一个NSURLConnection并且调用[connection connectionWithRequest]让它加载一点,然后在大多数情况下调用[连接取消]可以正常工作,则NSURLConnection出现问题。然而偶尔甚至在我调用[连接取消]之后,连接的委托仍然被调用(这会导致应用程序崩溃)。 Googling around it看起来像这里的问题是runloop中的竞争条件,我取消连接并释放委托,但在runloop循环之前调用委托函数 - >崩溃。NSURLConnection仍然调用委托AFTER取消方法被调用
我打电话给[连接取消]后确认连接实际上取消了吗?即使是一个蹩脚的while()循环会做:(
,直到你的委托收到无论是connectionDidFinishLoading:
或connectionDidFailWithError:
消息。
Delegates are not normally retained by the object they're acting as delegate for。然而,在这种情况下,你不应该释放连接&相关的存储,所以在NSURLConnection仍然指向它的情况下,代理不应该失效,除非你以某种方式过度释放它。
这是一个很好的经验法则,我会尝试实现这一点。 – Shizam 2010-03-29 16:23:18
@David Gelhar - 在这种情况下,它被保留,但代表**通常不保留**。从Apple的文档中可以看出,“委托对象不会(也不应该)保留他们的委托,但委托对象(通常是应用程序)的客户负责确保他们的委托人接收委托消息,为此,他们可能必须将代理保留在内存托管的代码中。“ http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html#//apple_ref/doc/uid/TP40002974-CH7-SW18 – DougW 2011-10-04 02:05:15
除了苹果文档说,代表将不再被取消后调用,所以在正常情况下,您将永远不会得到connectionDidFinishLoading或connectionDidFailWithError。 – user1055568 2014-04-02 21:36:08
我还没有遇到这个问题,但是这也可以在不捆绑你的委托对象的情况下工作:
由于所有委托方法都将接收调用连接对象作为参数,并且您也知道实际的活动连接对象(或无),因此只需通过比较两个对象来忽略委派操作。这样一个取消的“鬼”连接对象仍然可以调用委托,但不会干扰其内部。
- (void) connection:(NSURLConnection*) connection didReceiveData:(NSData*) data
{
if(connection != _URLConnection){return;}
...
[_incomingData appendData:data];
...
}
其中_URLConnection
是您的代理设置为活动连接,或无财产。
同样的问题在这里。请注意,在绝大多数情况下,'cancel'确实可以正常工作,并且委托上不会调用connectionDidFinishLoading和connectionDidFailWithError。看起来像委托对象的生命周期的大小写扩展可以解决这个问题。 – 2012-10-29 16:51:52