【问题标题】:Memory management, and async operations: when does an object become nil?内存管理和异步操作:对象何时变为 nil?
【发布时间】:2010-03-23 21:29:26
【问题描述】:

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

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

即如果我这样做:

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

现在执行 myvc 和 request.delegate == 指向 nil 的指针吗?

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

欢迎其他关于如何处理此问题的想法。

【问题讨论】:

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


    【解决方案1】:

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

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

    我想澄清一下 Cocoa 的引用计数内存管理。请务必记住,已发布的对象不会自动设置为nil。向nil 发送消息是完全合法的(并且什么也不做),但是向 deleted 对象发送消息是未定义的行为。保留指向已删除对象的指针是自找麻烦,这种活/死指针被称为僵尸。

    【讨论】:

    • 非常感谢您的回答。很有帮助。我当前的策略是共享下载队列,但是如果关闭,每个控制器都会从队列中删除其下载。到目前为止似乎运作良好......
    猜你喜欢
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2012-08-20
    相关资源
    最近更新 更多