【问题标题】:NSOperation Retention by an NSOperatioQueueNSOperation 由 NSOperationQueue 保留
【发布时间】:2012-02-17 21:46:45
【问题描述】:

我仍在努力了解 NSOperations。我希望用户能够发起一个 HTTP 请求,将该请求封装到一个 NSOperation 对象中,然后忘记它。我想在我的主代码中释放 NSOperation 对象,但让它由 NSOperationQueue 保留。

每个 NSOperation 通过将结果保存到核心数据中来完成,或者可以取消它。但是,我认为我只需要取消所有未完成的操作,而不是单个操作。例如,如果应用程序终止,我可能会全部取消它们。

这让我可以让用户继续发起请求,而不必单独跟踪它们。我可以重用相同的对象指针来初始化 NSOperation 对象,将其排队,然后释放它。如果 NSOperationQueue 在添加时保留 NSOperation,这看起来非常简单。

队列将保留操作,所以我可以在实例化的地方释放它吗?

另外,由于我是 ARC 的新手(我还没有尝试过),我该如何转让此所有权?我想我希望 NSOperation 在队列中有一个强大的属性属性,但我不认为我想用一个弱属性属性来实例化它。

【问题讨论】:

    标签: cocoa-touch cocoa automatic-ref-counting nsoperation nsoperationqueue


    【解决方案1】:

    你是对的。 NSOperationQueues 保留(强引用)添加到它的 NSOperations。 操作结束时会自动从队列中移除并释放。

    您应该确保您的 NSOperation 子类对于 isExecuting 和 isFinished 是 KVO 兼容的,如果失败,NSOperationQueue 将不知道 NSOperation 是否完整。

    在这种情况下,使用 ARC,您不必“转让”所有权。只有在创建 Core Foundation 对象(如 CF*Create 或 CF*alloc 之类的方法)并将其分配给 Objective-C 对象时,您才能“转移”所有权。

    如果你有兴趣,我详细写了ARC on my blog

    您可能还想查看MKNetworkKit,这是我编写的一个网络框架,几乎可以满足您的所有需求。

    【讨论】:

    • 谢谢,Mugunth。这两个参考资料看起来都是很好的资源。我已经搜索了 MKNetworkKit,以更好地了解我需要了解的有关 NSOperation 的一些基本知识。到目前为止,ARC 博客也很不错。看起来很完整。
    • "您应该确保您的 NSOperation 子类对于 isExecuting 和 isFinished 是 KVO 兼容的,如果失败,NSOperationQueue 将不知道 NSOperation 是否完整。" - 值得强调。
    猜你喜欢
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多