繁体   English   中英

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

[英]Is it possible to implement NSFastEnumeration when using weak references?

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

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

(1)我看不出有任何保证for(){}迭代构造本身会创建对对象的临时强引用,因此,如果{x}块的内容以导致要释放的对象,那么它将有一个悬空的引用。

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

您不能直接将强引用返回给调用方。 调用者不会释放它,并且快速枚举协议不能保证在调用者完成操作后您将有机会自己释放它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM