0

我有一个对象池,我保存在 NSMutableArray 中,所以如果任何其他对象想要引用它们而不是创建新对象,我只需给它一个对我已经创建的对象的引用。

过去,我会监视对这些对象的保留/释放调用,当它们的保留计数达到 1(仅限我的数组)时,我会将它们从数组中删除。但是我正在努力使用 ARC 来做到这一点,因为它不允许我监控保留/释放,我将如何去做呢?

4

3 回答 3

1

创建一种基于释放/保留调用来管理对象的方法,这是很危险的。如果苹果碰巧改变了它的工作方式,那你就完蛋了。显然,当您开始使用 ARC 时,情况就是如此。有两件事:

NSMutableArray1)如果它们是否被其他对象使用,您希望将对象独立保留在内部。在这种情况下,只需创建__weak对该对象的引用,这样您的对象(位于 内部NSMutableArray)就会保持活动状态。

2)一旦没有对该对象的引用,只需将其从NSMutableArray. 添加到NSMutableArraya__weak对象。一旦strong一个被释放,阵列内的一个也会被释放,虽然我不太喜欢这种方法,因为我觉得它很危险。如果您选择此选项,请使用它来存储对象:

NSValue *weakObject = [NSValue valueWithNonretainedObject:anObject];
[array addObject:weakObject];

最后,您可以简单地从该特定文件中删除 ARC,并且可以继续监控。

于 2012-11-21T13:57:11.627 回答
0

首先,您应该编写简单的代码,供人类使用。

在您(通过仪器或其他措施)证明这是一个关键瓶颈之前,不要担心此类性能问题。

也就是说,创建某些对象可能非常昂贵,因此为某些对象保留缓存本身并不是一个坏主意。但是,您永远不应该依赖引用计数,即使在非 ARC 代码中也是如此。苹果文档对此非常清楚。

正如 Jacky 指出的那样,替代方案是一个弱参考。不幸的是,您不能将weak引用放入标准集合中(尽管具有讽刺意味的是,您可以将它们放入 C++ 集合中并且它们将被正确管理)。

但是,您可以创建一个简单的包装类来保存弱引用。

@interface WeakWrapper : NSObject
@property (readonly) id object;
- (id)initWithObject:(id)object;
@end

@implementation WeakWrapper {
    __weak id _object;
}
- (id)object {
    return _object;
}
- (id)initWithObject:(id)object {
    if (self = [super init]) {
        _object = object;
    }
    return self;
}
@end

然后,您可以将这些对象放在集合中,然后...

WeakWrapper *wrapper = // get the object from the collection
id object = wrapper.object;
if (nil == object) {
    // You know the object that was being referenced no longer exists
    // so this wrapper can be removed from the collection and destroyed.
}
于 2012-11-21T15:37:53.360 回答
0

我不会为如此复杂的系统而烦恼。只使用强属性和弱属性,不要试图猜测性能。您正在尝试自己构建一个内存管理系统,这对 ARC 来说意义不大。创建和删除对象通常只占任何 Objective-c 应用程序性能的一小部分;经过多年使用 Instruments 监控性能后,我不再担心这部分了。

于 2012-11-21T14:46:11.980 回答