内存管理和异步操作:对象何时变为零?

时间:2010-03-23 21:29:27

标签: objective-c memory-management delegates null asihttprequest

我有一个视图,将显示下载的图像和文本。我想使用ASIHTTPRequest异步处理所有下载,但我不确定如何在下载完成后通知视图...

如果我将视图控制器作为ASIHTTPRequest的委托者传递,然后我的视图被销毁(用户导航离开),当它尝试向视图控制器发送消息时,它是否会正常失败,因为委托现在为零?

即。如果我这样做:

UIViewController *myvc = [[UIViewController alloc] init];
request.delegate = myvc;
[myvc release];

myvc,request.delegate now ==指向nil的指针?

这是自学成才的问题......我对某些基本概念有点模糊。

欢迎提出如何处理此问题的其他想法。

1 个答案:

答案 0 :(得分:3)

更新: 查看source code for ASIHTTPRequest保留其委托,因此您的代码必须确保委托人尚未被释放,或者在释放控制器之前将请求的委托属性设置为nil

如果要运行多个异步HTTP请求,最好创建一个HTTPRequestManager类作为HTTP请求的所有的委托。这个HTTPRequestManager类将在应用程序的整个生命周期内保留在内存中,如果/当您的视图控制器被释放时,它可以正常地处理失败。

我想补充说明Cocoa的引用计数内存管理。请务必记住,已发布的对象会自动设置为nil。向nil发送消息是完全合法的(并且什么都不做),但是向已删除的对象发送消息是未定义的行为。保持指向已删除对象的指针是一个麻烦,这种生命/死亡指针被称为僵尸。