NSCopyObject,那个不断制造破坏的捣蛋鬼——韦德·特雷加斯基斯

主要观点:

  • 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:)
阅读 17
0 条评论