使用弱引用时是否可以实现NSFastEnumeration?

时间:2014-01-22 23:06:47

标签: ios iphone objective-c automatic-ref-counting

我有一个集合,它维护对其对象的弱引用。我希望它符合NSFastEnumeration,但countByEnumeratingWithState:objects:count:提供的缓冲区使用unsafe_unretained引用。这会产生一个间隙,在此期间返回的引用可能会变为无效但归零。

在一般情况下这很好 - 如果集合将其(当前有效但弱引用的)对象填充到缓冲区并返回它,那么调用者可能会在需要时创建自己的强引用。但这留下了两个问题:

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

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

1 个答案:

答案 0 :(得分:1)

您无法直接向调用者返回强引用。调用者不会释放它,并且快速枚举协议不保证您在调用者完成后有机会自己释放它。

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