【问题标题】:How to remove an object from NSMutableArray only when retain count reaches 0?仅当保留计数达到 0 时,如何从 NSMutableArray 中删除对象?
【发布时间】:2011-06-19 15:04:20
【问题描述】:

我知道我不应该检查或使用retainCount,但我想知道是否有办法让NSMutableArray 中的对象仅在其保留计数为0 后才从其中删除。

基本上,我想将对象添加到数组中,并让这些对象在其他窗口之间共享。当一个窗口使用它时,我希望保留计数增加 1。当它不再使用时,我希望它减少。但是,如果某个窗口仍在使用它,那么我希望它对所有其他窗口可用。当所有窗口不再使用它时,我希望将它从数组中移除并完全释放。

谢谢!

【问题讨论】:

    标签: objective-c xcode shared-memory retaincount


    【解决方案1】:

    对于在发布时自动从数组中删除,您可以使用关联对象,正如 Dave DeLong 所述:
    How to add alive object to NSMutableArray and remove them when they're released?

    但您最好使用NSCountedSet,因为它完全实现了您所追求的。它只是缺少物品顺序。 为了弥补项目订单​​的不足,您可以使用附加的NSMutableArray 来保持订单并在其中添加/删除项目与您的计数集同步

    【讨论】:

    • 是的。那是我自己的问题。它实际上并没有解决我的问题。事实上,它提出了一个全新的 KVO 问题。如果我用 KVO 监视数组,那么该数组中的每个对象都会被保留,所以什么都不会被释放。不知道为什么。 stackoverflow.com/questions/6400627/…
    • @david:如果您不依赖商品订单,请使用 NSCountedSet(请参阅更新的答案)。
    • 问题是 NS*Set 不支持 KVO。所以我无法监控集合中的内容。
    • 虽然两者都不能完全满足您的需求,但将它们结合起来可以为您带来两全其美的效果。像以前一样使用 NSMutableArray 并添加一个额外的 NSCountedSet 用于检查成员计数(更新/查询数组中的每个添加/删除,您可以通过 KVO 观察)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    相关资源
    最近更新 更多