objective-c - 内存管理和异步操作: when does an object become nil?

标签 objective-c memory-management delegates null asihttprequest

我有一个将显示下载的图像和文本的 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/

相关文章:

iphone - 我可以使用 AVFoundation 在 iPhone 3G 上录制视频吗?

iphone - 如何使用 AFNetworking 为 "PUT"请求设置数据?

c - C中的基本内存分配和释放

delegates - 如何将表达式树保存为新的可执行磁盘文件的主要入口点?

ios - 如果委托(delegate)不再存在会怎样?

objective-c - 如何使用按钮移动图像?

iOS:UIImageView随着UITableView.rowHeight的变化而变化,如何避免?

c# - 调用单元测试委托(delegate)操作

c++ - 检测内存泄漏的工具

c - 我想控制文件指针位置