2010-03-23 97 views
2

如果我创建一个NSURLConnection并且调用[connection connectionWithRequest]让它加载一点,然后在大多数情况下调用[连接取消]可以正常工作,则NSURLConnection出现问题。然而偶尔甚至在我调用[连接取消]之后,连接的委托仍然被调用(这会导致应用程序崩溃)。 Googling around it看起来像这里的问题是runloop中的竞争条件,我取消连接并释放委托,但在runloop循环之前调用委托函数 - >崩溃。NSURLConnection仍然调用委托AFTER取消方法被调用

我打电话给[连接取消]后确认连接实际上取消了吗?即使是一个蹩脚的while()循环会做:(

+0

同样的问题在这里。请注意,在绝大多数情况下,'cancel'确实可以正常工作,并且委托上不会调用connectionDidFinishLoading和connectionDidFailWithError。看起来像委托对象的生命周期的大小写扩展可以解决这个问题。 – 2012-10-29 16:51:52

回答

6

,直到你的委托收到无论是connectionDidFinishLoading:connectionDidFailWithError:消息。

Delegates are not normally retained by the object they're acting as delegate for。然而,在这种情况下,你不应该释放连接&相关的存储,所以在NSURLConnection仍然指向它的情况下,代理不应该失效,除非你以某种方式过度释放它。

+0

这是一个很好的经验法则,我会尝试实现这一点。 – Shizam 2010-03-29 16:23:18

+0

@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

+1

除了苹果文档说,代表将不再被取消后调用,所以在正常情况下,您将永远不会得到connectionDidFinishLoading或connectionDidFailWithError。 – user1055568 2014-04-02 21:36:08

0

我还没有遇到这个问题,但是这也可以在不捆绑你的委托对象的情况下工作:

由于所有委托方法都将接收调用连接对象作为参数,并且您也知道实际的活动连接对象(或无),因此只需通过比较两个对象来忽略委派操作。这样一个取消的“鬼”连接对象仍然可以调用委托,但不会干扰其内部。

- (void) connection:(NSURLConnection*) connection didReceiveData:(NSData*) data 
{ 
    if(connection != _URLConnection){return;} 
    ... 
    [_incomingData appendData:data]; 
    ... 
} 

其中_URLConnection是您的代理设置为活动连接,或无财产。

相关问题