何时取消 uinavigationcontroller 中的 nsurlconnection
Posted
技术标签:
【中文标题】何时取消 uinavigationcontroller 中的 nsurlconnection【英文标题】:when to cancel nsurlconnection in a uinavigationcontroller 【发布时间】:2011-06-27 17:45:45 【问题描述】:有人可以向我解释为什么当我按下 uinavigationcontroller 上的后退按钮时没有调用 viewcontroller dealloc 方法吗?
我想正确取消我的 nsurlconnection,这样它就不会因为它的委托不再有效而尝试显示弹出窗口和崩溃。
我的 NSURLConnection 初始化如下:
NSURLRequest *request = [ [ NSURLRequest alloc ] initWithURL: [ NSURL URLWithString: [ NSString stringWithFormat: @"http://www.url.com" ], string1, string2 ] ] ];
connection = [ [ NSURLConnection alloc ] initWithRequest: request delegate: self ];
[ request release ];
我在 connectionDidFinishLoading 和 didFailWithError 中释放了连接,但我想在用户按下后退按钮时取消并释放连接。最合乎逻辑的地方似乎是 dealloc 方法,但我怀疑它没有被调用,因为连接保留了 viewcontroller。
确保按下后退按钮时取消连接的最佳方法是什么?我不想使用 viewwilldissapear,因为我以模态方式呈现了另一个视图控制器,这不应该是取消的原因(除非在模态视图控制器中会出现同样的问题,弹出+崩溃)。
【问题讨论】:
NSURLConnection
在初始化时保留其委托,并在连接完成加载、失败或取消时释放它。
如何处理超时?在出现超时弹出窗口之前,用户将弹出视图控制器。当超时最终发生时,这会导致崩溃.. :-(
“...崩溃,因为它的委托不再有效”。如果NSURLConnection
保留它的委托以确保它不是dealloc
ated(除非它在其他地方过度发布),它怎么可能不再有效?
你是对的,它仍然有效。但是,当我不在创建连接的视图控制器中并且我关闭了“超时”弹出窗口时,为什么我的应用程序会崩溃?
【参考方案1】:
我建议你使用 viewwilldisappear。即使您呈现另一个模态视图控制器也没问题。在你的视野中这样做就会消失。然后在.h文件中声明你的连接对象
if(urConnection)
[urconnection Cancel];
[urconnection release];
【讨论】:
我会接受这个答案,因为它是最有用的。最后,我通过在 connectiondidfailwitherror 中不显示任何弹出窗口来解决我的问题,除非视图控制器当前可见。如果它不可见,我就释放所有剩余的内存。【参考方案2】:好吧,最好在dealloc方法或connectionDidFinishLoading委托中释放连接对象。但我不认为它用于释放后退按钮上的连接,因为一旦按下后退按钮,对象就会自行销毁并调用 dealloc 方法。因此,使用 dealloc 方法放置代码以释放连接。
【讨论】:
我想在 dealloc 方法中释放连接,但它永远不会被调用,例如,在 x 分钟后连接超时。只有当超时发生时才会调用dealloc,但到那时为时已晚,因为我在不同的视图控制器中。我想每个人都需要在视图控制器弹出时取消他们的挂起连接(假设您将代理设置为 self 进行连接)?以上是关于何时取消 uinavigationcontroller 中的 nsurlconnection的主要内容,如果未能解决你的问题,请参考以下文章
UINavigationController - 检测何时导航回根视图控制器
UINavigationController:推送的视图何时收到 Dealloc 消息?
UINavigationController - 何时释放推送的视图控制器等
UINavigationController 中的 UISearchBar,取消按钮不可选