-retainCount 究竟有多不可靠?
Just how unreliable is -retainCount, exactly?
我想创建一个不需要消费者手动释放对象的对象池。相反,每次请求新对象时,它都会检查池中的所有对象以查看它们的保留计数是否为 1(仅由池拥有)。如果是,那就returns吧。
需要多少技巧才能使这个总体计划生效?
示例: 我知道某些无法释放的 NSString 的保留计数始终为 -1,并且无法释放标记的指针(我也不会希望它们在对象池中)。 类 不是基本集合的一部分(NSString、NSArray、NSDate 和其他一些),例如UIView,围绕保留的优化较少,因此保留计数更可靠?
retainCount
它提供的信息是可靠的,但对于您所描述的用途也可能毫无用处。
retainCount
告诉您一个对象存在多少个保留项(大多数情况下,正如您所指出的,对于无法解除分配的对象有几个例外)。但是,它没有告诉您这些保留的所有者是谁。特别是您不能使用它来确定这些现有保留中的任何一个是否是自动释放池的一部分。
- 一个对象可能报告
retainCount
的 1
,但唯一保持分配的保留可能是自动释放池的一部分,该池将释放并因此在池结束时释放它当前 运行 循环。
- 一个对象可能报告
retainCount
of 10
但你建议的对象池可能只有自动释放池之外的保留,所以在当前 运行 循环结束时它将回到 1
.
- 一个对象可能报告
retainCount
的 10
,但它们都可以从自动释放池中保留,并且当池耗尽时它仍将被释放。
此外,从你的问题来看,你认为你需要这种行为的原因还不清楚。您通常可以 return 向您的消费者自动释放对象。如果消费者打算重用它,则他们应该保留该对象,但是无论他们是否这样做,您的池都可以选择保留和重用该对象(或不)。
我想创建一个不需要消费者手动释放对象的对象池。相反,每次请求新对象时,它都会检查池中的所有对象以查看它们的保留计数是否为 1(仅由池拥有)。如果是,那就returns吧。
需要多少技巧才能使这个总体计划生效?
示例: 我知道某些无法释放的 NSString 的保留计数始终为 -1,并且无法释放标记的指针(我也不会希望它们在对象池中)。 类 不是基本集合的一部分(NSString、NSArray、NSDate 和其他一些),例如UIView,围绕保留的优化较少,因此保留计数更可靠?
retainCount
它提供的信息是可靠的,但对于您所描述的用途也可能毫无用处。
retainCount
告诉您一个对象存在多少个保留项(大多数情况下,正如您所指出的,对于无法解除分配的对象有几个例外)。但是,它没有告诉您这些保留的所有者是谁。特别是您不能使用它来确定这些现有保留中的任何一个是否是自动释放池的一部分。
- 一个对象可能报告
retainCount
的1
,但唯一保持分配的保留可能是自动释放池的一部分,该池将释放并因此在池结束时释放它当前 运行 循环。 - 一个对象可能报告
retainCount
of10
但你建议的对象池可能只有自动释放池之外的保留,所以在当前 运行 循环结束时它将回到1
. - 一个对象可能报告
retainCount
的10
,但它们都可以从自动释放池中保留,并且当池耗尽时它仍将被释放。
此外,从你的问题来看,你认为你需要这种行为的原因还不清楚。您通常可以 return 向您的消费者自动释放对象。如果消费者打算重用它,则他们应该保留该对象,但是无论他们是否这样做,您的池都可以选择保留和重用该对象(或不)。