为什么对具有自定义内存管理语义的集合使用免费桥接?

Why use toll-free bridging for collections with custom memory-management semantics?

书中

Effective Objective-C 2.0: 52 Specific Ways to Improve Your iOS and OS X Program

有一个

Item 49: Use Toll-Free Bridging for Collections with Custom Memory-Management Semantics

本章主要以解决NSDictionary中键被复制而值被保留的问题为例说明免费桥接的重要性

它说,我引用如下:

What if the objects you want to use as keys cannot be copied?

我的问题是,如果Objective-C中的所有对象都是NSObject的子类,一开始就实现了copy方法,怎么会有不能复制的对象呢?是否有任何真实场景需要这种情况?

NSObject 实现 -copy 是为了方便 NSCopying-copyWithZone:。如果您的对象不符合 NSCopying 并实现 -copyWithZone:,则对其调用 -copy 将引发异常。并非所有对象都实现复制,这就是为什么您需要保留它们而不是复制的原因。 (有关 -copy 的更多信息,请参阅 documentation for -[NSObject copy]。)