主要观点:
NSCopyObject
是一个古老的 Foundation 函数,其实现复杂,最初类似[memcpy]
,现在包含更多操作。NSCopyObject
的复制操作存在缺陷,仅对 ARC 管理的 Objective-C ivars 有效,对 C++ ivars、Swift 存储属性等无效。- 即使开发者不主动使用
NSCopyObject
,其超类可能使用,且开发者无法控制超类未来是否使用,这会带来问题。 - 在 Objective-C 中,应对
NSCopyObject
的方法在 ARC 环境下变得困难,一些指南存在错误。在 Swift 中,由于语言特性,处理NSCopyObject
更困难,目前最好的做法是假设超类会使用NSCopyObject
并手动增加引用计数。 - Apple 自身在其应用和框架中仍在使用
NSCopyObject
,尽管它已被弃用多年,这导致了诸多问题。 NSCopying
一直存在危险且易出错,在子类中默认不工作,需要手动重写copy(with:)
。
关键信息:
NSCopyObject
的实现细节,包括内存分配、字节复制和修复 ivars 等操作。- 不同环境下(Objective-C 与 Swift)应对
NSCopyObject
的方法及存在的问题。 NSCopying
的缺陷及在子类中的使用注意事项。- Apple 对
NSCopyObject
的态度及仍在使用的情况。
重要细节:
fixupCopiedIvars
是在 Mac OS X 10.6 引入 ARC 时添加的,用于尝试修复复制对象的损坏。- 在 Objective-C 中,预 ARC 时可手动
retain
子类的引用 ivars,但 ARC 环境下无法直接这样做,一些指南存在错误。 - Swift 中设置属性为
nil
会导致错误释放,目前最好的做法是假设超类使用NSCopyObject
并手动处理。 NSCopyObject
自 2012 年起已被官方弃用,但 Apple 仍在使用,且NSCopying
一直存在问题,在子类中需要手动重写copy(with:)
。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。