<分区>
我正在寻求创建一个不需要消费者手动释放对象的对象池。相反,每次请求新对象时,它都会检查池中的所有对象以查看它们的保留计数是否为 1(仅由池拥有)。如果是,则返回它。
要使这个总体计划发挥作用,需要多少技巧?
示例: 我知道某些无法释放的 NSString 的保留计数始终为 -1,并且无法释放标记的指针(我也不希望它们出现在对象中水池)。不属于基本集合的类(NSString、NSArray、NSDate 和其他一些),例如UIView,围绕保留的优化较少,因此保留计数更可靠?
<分区>
我正在寻求创建一个不需要消费者手动释放对象的对象池。相反,每次请求新对象时,它都会检查池中的所有对象以查看它们的保留计数是否为 1(仅由池拥有)。如果是,则返回它。
要使这个总体计划发挥作用,需要多少技巧?
示例: 我知道某些无法释放的 NSString 的保留计数始终为 -1,并且无法释放标记的指针(我也不希望它们出现在对象中水池)。不属于基本集合的类(NSString、NSArray、NSDate 和其他一些),例如UIView,围绕保留的优化较少,因此保留计数更可靠?
最佳答案
retainCount
它提供的信息是可靠的,但对于您所描述的用途也可能无用。
retainCount
告诉您一个对象存在多少个保留项(大多数情况下,正如您所指出的,对于无法释放的对象有几个异常(exception))。但是,它没有告诉您这些保留的所有者是谁。特别是您不能使用它来确定这些现有保留中的任何一个是否是自动释放池的一部分。
retainCount
的 1
但唯一保持分配状态的保留可能是自动释放池的一部分,该池将在当前运行循环结束时池耗尽时释放并因此解除分配。retainCount
的 10
但是您建议的对象池可能只有自动释放池之外的保留,因此在当前运行循环结束时它将返回到 1
.retainCount
的 10
但它们都可以从自动释放池中保留下来,并且在池耗尽时仍会被释放。此外,从您的问题来看,您不清楚为什么您认为您需要这种行为。您通常可以将自动释放的对象返回给您的消费者。如果消费者打算重用它,则他们应该保留该对象,但是无论他们是否这样做,您的池都可以选择保留和重用该对象(或不)。
关于ios - -retainCount 究竟有多不可靠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42547649/