2014-01-22 38 views
1

我有一个集合保持其对象的弱引用。我希望它符合NSFastEnumeration,但countByEnumeratingWithState:objects:count:提供的缓冲区使用unsafe_unretained引用。这会产生一个间隙,在此期间返回的参考可能会失效,但不是归零。在一般情况下这很好 - 如果集合将其(当前有效但弱引用的)对象填充到缓冲区并返回,那么调用者可能会根据需要创建自己的强引用。但是,这留下了两个问题:使用弱引用时可以实现NSFastEnumeration吗?

(1)我看不到任何保证for(){}迭代构造本身会创建对该对象的临时强引用,因此如果{x}块的内容更改集合外的某些内容以某种方式导致对象被释放,然后它将有一个悬而未决的参考。

(2)从countByEnumeratingWithState:返回时仍然有一个小的差距,在此期间另一个线程上的活动可能使参考无效。我的集合并不是线程安全的,但如果它至少可以安全地存储对其他线程可以引用的对象的引用,那将是非常好的,因为在任何多线程应用程序中确实没有办法阻止它。

回答

1

你不能直接返回一个强大的引用给调用者。调用者不会释放它,并且快速枚举协议并不保证当调用者完成时您将有机会自行释放它。

相反,您可以在将对象存储到缓冲区之前保留+ autorelease对象。这将保证对象在呼叫者使用它们时保持活动状态。它可能会伤害快速枚举的“快速”部分,但您仍然可以获得“方便的语法”部分。如果在读取弱变量之后添加一个零检查,则可以避免将nil指针存储到缓冲区中。

+1

这可以工作,我想。你有没有一种方法让运行时生成一个有保证的保留+自动释放的方法(也就是说,某种程度上,编译器在某些时候不能/不会将其优化)? –