首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用弱引用时,可以实现NSFastEnumeration吗?

当使用弱引用时,可以实现NSFastEnumeration吗?
EN

Stack Overflow用户
提问于 2014-01-22 23:06:46
回答 1查看 171关注 0票数 1

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

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2014-01-23 00:19:15

不能直接向调用方返回强引用。调用方不会释放它,而快速枚举协议也不能保证在调用者完成时您将有机会自行释放它。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21295968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档