我有一个集合维护对其对象的弱引用。我希望它符合 NSFastEnumeration
,但 countByEnumeratingWithState:objects:count:
提供的缓冲区使用 unsafe_unretained
引用。这会产生一个间隙,在此期间返回的引用可能会变得无效但不会归零。
在一般情况下这很好——如果集合将其(当前有效但弱引用的)对象填充到缓冲区中并返回它,那么调用者可能会在需要时创建自己的强引用。但这留下了两个问题:
(1) 我看不到 for(){}
迭代构造本身会创建对该对象的临时强引用的任何保证,因此如果 {x} block 的内容发生变化集合之外的东西以导致对象被释放的方式出现,那么它就会有一个悬空引用。
(2) 从 countByEnumeratingWithState:
返回时仍然存在一个小间隙,在此期间另一个线程上的事件可能会使引用无效。我的集合并不意味着是线程安全的,但如果它至少可以安全地存储对可以在另一个线程上引用的对象的引用,那就太好了,因为在任何多线程应用程序中确实没有办法阻止这种情况。
最佳答案
您不能将强引用直接返回给调用者。调用者不会释放它,快速枚举协议(protocol)不保证你有机会在调用者完成后自己释放它。
相反,您可以在将对象存储到缓冲区之前保留+自动释放它们。这将保证对象在调用者使用它们时保持事件状态。它可能会损害快速枚举的“快速”部分,但您仍然会得到“方便的语法”部分。如果在读取弱变量后添加 nil 检查,则可以避免将 nil 指针存储到缓冲区中。
关于ios - 使用弱引用时是否可以实现 NSFastEnumeration?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21295968/