我有一个集合,它维护对其对象的弱引用。我希望它符合NSFastEnumeration,但是countByEnumeratingWithState:objects:count:提供的缓冲区使用unsafe_unretained引用。这会造成一个空白,在此期间,返回的引用可能会变得无效,但不会变为零。
这在一般情况下是很好的--如果集合将其(当前有效但引用较弱)对象填充到缓冲区并返回它,那么调用方可能会在需要时创建自己的强引用。但这就留下了两个问题:
(1)我看不到for(){}迭代构造本身创建对对象的临时强引用的任何保证,因此如果{x}块的内容以导致释放对象的方式更改集合之外的内容,那么它将有一个悬空引用。
(2)从countByEnumeratingWithState:返回时仍然存在一个很小的差距,在此期间,另一个线程上的活动可能会使引用失效。我的集合并不是线程安全的,但是如果它至少能够安全地存储对对象的引用,而这些对象可以在另一个线程上引用,那就太好了,因为在任何多线程应用程序中都无法阻止这种情况。
发布于 2014-01-23 00:19:15
不能直接向调用方返回强引用。调用方不会释放它,而快速枚举协议也不能保证在调用者完成时您将有机会自行释放它。
相反,您可以在将对象存储到缓冲区之前对其进行retain+autorelease。这将保证对象在调用方使用时保持活动状态。它可能会损害快速枚举的“快速”部分,但仍然会得到“方便的语法”部分。如果在读取弱变量后添加了零检查,则可以避免将零指针存储到缓冲区中。
https://stackoverflow.com/questions/21295968
复制相似问题