NSCache是否可视为Sendable?基于官方文档的技术问询
NSCache 是否可视为 Sendable(仅限制添加、移除、查询操作)
答案是可以,但需要满足几个关键前提:
从线程安全基础来看
官方文档明确说明NSCache的添加、移除、查询操作本身是线程安全的——这些操作内部已经实现了同步机制,无需额外加锁。而Sendable的核心要求之一就是并发访问时不会出现数据竞争,仅使用这三类操作的话,NSCache本身的访问逻辑是符合这个要求的。必须保证缓存内对象的Sendability
NSCache存储的键和值对象必须本身是Sendable类型。因为这些对象会随着缓存的跨线程访问被传递到不同线程,如果它们本身不具备Sendable特性,依然会引入数据竞争风险,整个缓存的Sendable安全性也就不成立。Swift中的实际使用注意
由于NSCache是Objective-C时代的类型,官方并没有给它添加Sendable协议的一致性。所以在Swift代码中如果要把它标记为Sendable,需要使用@unchecked Sendable:class SafeCache<Key: AnyObject & Hashable, Value: AnyObject>: NSCache<Key, Value>, @unchecked Sendable { // 仅暴露添加、移除、查询相关方法 }但使用
@unchecked时必须严格遵守限制:只使用那些明确线程安全的操作,绝不调用未明确线程安全的API,也不要在子类中重写方法时破坏原有同步逻辑。
内容的提问来源于stack exchange,提问作者CalebK
相关产品推荐
相关产品推荐

