代码之家  ›  专栏  ›  技术社区  ›  Kenny Winker

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

  •  2
  • Kenny Winker  · 技术社区  · 16 年前

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

    如果我将视图控制器作为asihttpRequest的委托传递,然后视图被破坏(用户导航离开),当它试图向我的视图控制器发送消息时,它是否会优雅地失败,因为委托现在为零?

    也就是说,如果我这样做:

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

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

    这是自学的问题…我对一些基本概念有点模糊。

    欢迎其他有关如何处理这一问题的想法。

    1 回复  |  直到 16 年前
        1
  •  3
  •   James Eichele Bernard Igiri    16 年前

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

    如果要运行多个异步HTTP请求,最好创建一个 HTTPRequestManager 作为代理的类 全部的 您的HTTP请求。这个 HTT请求管理器 类将在应用程序的整个生命周期中一直保留在内存中,并且如果/当释放视图控制器时,它可以优雅地处理失败。

    我想补充一个关于Cocoa的参考计数内存管理的说明。重要的是要记住,释放的对象是 自动设置为 . 向发送消息 是完全合法的(而且什么也不做),但是向 删除 对象是未定义的行为。保持指向已删除对象的指针会带来麻烦,这种活/死指针被称为僵尸。