2015-04-04 81 views
0

我在UIViewControllerviewDidLoad中创建和启动NSURLConnection。并且UIViewController被设置为NSURLConnection的代表。UIViewController和NSURLConnection

如果UIViewControllerNSURLConnection完成工作之前销毁(释放),会发生什么情况?我猜,它会尝试调用委托,并且应用程序将崩溃。

以前(在使用ARC之前),我曾经记得NSURLConnection是一个强烈的参考,cancel它在UIViewControllerdealloc的方法。

使用ARC时我应该做些类似的事情吗?如果不是,为什么?

+0

有疑问时,应进行实验。 – 2015-04-04 14:38:52

回答

2

为什么不会使用ARC时你做同样的事情?如果在ARC之前做这件事很重要,那么在ARC之后做这件事很重要。内存管理是内存管理。发送给不再存在的委托的消息的危险性完全相同。这是所有相同,ARC或没有ARC - 除了在ARC下,retainrelease正在为您调用。

+0

顺便说一下,考虑切换到NSURLSession。它更好。 NSURLConnection尚未被弃用,但它正在出路。 – matt 2015-04-04 15:44:47

+0

另请参阅本书末尾的警告:http://www.apeth.com/iOSBook/ch12.html#_retain_cycles_and_weak_references _您正在使用ARC,但_Cocoa_通常不会;委托引用不是ARC弱的,因此Cocoa不会奇迹般地知道委托是否被销毁,并且仍然会尝试向不存在的委托发送消息,就像在ARC之前完成的一样,因为Cocoa本身就是ARC之前的_is_ 。 – matt 2015-04-04 15:48:46

1

NSURLConnection必须存储连接对象的某些内部引用,以便它不会崩溃。就个人而言,我一直保持强大的参考,因为我们不知道内部sdk实际上如何保存这些引用,并且这种行为也可能随着sdk而改变。

可避免崩溃时,连接对象之前,视图控制器的dealloc通过委托方法设置为nil,并呼吁取消方法的实例