2012-11-21 40 views
0

我有我保持一个NSMutableArray内,所以如果任何其他对象要引用它们,而不是创建新的对象,我会简单地把它交给我已经创建了一个对象的引用对象池。ARC的NSMutableArray池

在过去,我将监测保留/对这些对象呼吁释放,而当他们到达的1挡计数(我的阵列只),我会从阵列中删除。然而,我正在努力做到这一点与ARC,因为它不让我监视保留/释放,我怎么会这样做呢?

+0

这是一个不好的做法。绝不依赖于retainCount。 –

回答

1

创建一种基于释放/保留呼叫来管理对象的方法,这很危险。如果苹果改变了它的工作方式,那么你就被搞砸了。显然,当你开始使用ARC时,就是这样发生的。有两件事情:

1)你想保持独立,如果他们被其他物体或不使用NSMutableArray内的对象。在这种情况下,只需创建一个对该对象的引用__weak,这样,您的对象即位于NSMutableArray中的对象将保持活动状态。

2)一旦有没有对象的引用,只是从NSMutableArray删除它。添加到NSMutableArray a __weak对象。一旦发布strong,就会发布阵列中的一个,尽管我不太喜欢这种方法,因为我觉得它很危险。如果你去了这个选项,使用这个存储对象:

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

最后,你可以简单地从该特定文件删除ARC,你可以保持监控。

+0

'weak'和'unrereined'之间有区别。 –

+0

你能解释一下吗? – Peres

+0

非保留就意味着...“保留”不被调用。这与'弱'非常不同,当对象被释放时,参考值被置零。 –

0

我不会打扰这样一个复杂的系统。只要与强大和弱的属性一起工作,不要尝试再次猜测性能。你正试图建立一个自己的内存管理系统,这对ARC来说毫无意义。创建和删除对象通常只是任何objective-c应用程序性能的一小部分;经过多年使用仪器来监测性能,我不再担心这部分。

0

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

不要担心这样的性能问题,直到你已经证明(通过仪器或一些其他方法),这是一个严重的瓶颈。

也就是说,创建特定的对象可真贵,所以在保持为特定对象缓存中没有其本身是一个坏主意。但是,即使在非ARC代码中,也不应该依赖引用计数。 Apple的文档对此非常清楚。

另外,正如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. 
}