我有我保持一个NSMutableArray内,所以如果任何其他对象要引用它们,而不是创建新的对象,我会简单地把它交给我已经创建了一个对象的引用对象池。ARC的NSMutableArray池
在过去,我将监测保留/对这些对象呼吁释放,而当他们到达的1挡计数(我的阵列只),我会从阵列中删除。然而,我正在努力做到这一点与ARC,因为它不让我监视保留/释放,我怎么会这样做呢?
我有我保持一个NSMutableArray内,所以如果任何其他对象要引用它们,而不是创建新的对象,我会简单地把它交给我已经创建了一个对象的引用对象池。ARC的NSMutableArray池
在过去,我将监测保留/对这些对象呼吁释放,而当他们到达的1挡计数(我的阵列只),我会从阵列中删除。然而,我正在努力做到这一点与ARC,因为它不让我监视保留/释放,我怎么会这样做呢?
创建一种基于释放/保留呼叫来管理对象的方法,这很危险。如果苹果改变了它的工作方式,那么你就被搞砸了。显然,当你开始使用ARC时,就是这样发生的。有两件事情:
1)你想保持独立,如果他们被其他物体或不使用NSMutableArray
内的对象。在这种情况下,只需创建一个对该对象的引用__weak
,这样,您的对象即位于NSMutableArray
中的对象将保持活动状态。
2)一旦有没有对象的引用,只是从NSMutableArray
删除它。添加到NSMutableArray
a __weak
对象。一旦发布strong
,就会发布阵列中的一个,尽管我不太喜欢这种方法,因为我觉得它很危险。如果你去了这个选项,使用这个存储对象:
NSValue *weakObject = [NSValue valueWithNonretainedObject:anObject];
[array addObject:weakObject];
最后,你可以简单地从该特定文件删除ARC,你可以保持监控。
'weak'和'unrereined'之间有区别。 –
你能解释一下吗? – Peres
非保留就意味着...“保留”不被调用。这与'弱'非常不同,当对象被释放时,参考值被置零。 –
我不会打扰这样一个复杂的系统。只要与强大和弱的属性一起工作,不要尝试再次猜测性能。你正试图建立一个自己的内存管理系统,这对ARC来说毫无意义。创建和删除对象通常只是任何objective-c应用程序性能的一小部分;经过多年使用仪器来监测性能,我不再担心这部分。
首先,您应该编写用于人类的简单代码。
不要担心这样的性能问题,直到你已经证明(通过仪器或一些其他方法),这是一个严重的瓶颈。
也就是说,创建特定的对象可真贵,所以在保持为特定对象缓存中没有其本身是一个坏主意。但是,即使在非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.
}
这是一个不好的做法。绝不依赖于retainCount。 –