我有一个将显示下载的图像和文本的 View 。我想使用 ASIHTTPRequest 异步处理所有下载,但我不确定如何在下载完成时通知 View ...
如果我将 View Controller 作为 ASIHTTPRequest 的委托(delegate)传递,然后我的 View 被销毁(用户导航离开),当它尝试向我的 View Controller 发送消息时,它是否会正常失败,因为委托(delegate)现在为零?
即如果我这样做:
UIViewController *myvc = [[UIViewController alloc] init];
request.delegate = myvc;
[myvc release];
myvc 和 request.delegate 现在 == 是一个指向 nil 的指针吗?
这是自学的问题......我对一些基本概念有点模糊。
欢迎提出有关如何处理此问题的其他想法。
最佳答案
更新:查看 source code for ASIHTTPRequest ,它不保留其委托(delegate),因此您的代码必须确保委托(delegate)尚未被释放,或者在释放 Controller 之前将请求的委托(delegate)属性设置为nil
.
如果您要运行多个异步 HTTP 请求,那么创建一个 HTTPRequestManager
类来充当所有 HTTP 请求的委托(delegate)可能是个好主意。这个 HTTPRequestManager 类将在应用程序的整个生命周期中保留在内存中,并且如果/当您的 View Controller 被释放时,它可以优雅地处理失败。
我想补充一下关于 Cocoa 的引用计数内存管理的说明。重要的是要记住,释放的对象不会自动设置为nil
。向nil
发送消息是完全合法的(并且什么也不做),但是向已删除对象发送消息是未定义的行为。保留指向已删除对象的指针是自找麻烦,这种活/死指针被称为僵尸。
关于objective-c - 内存管理和异步操作: when does an object become nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2503775/