最近在尝试在此处回答问题时,我运行了一些测试代码,以查看Xcode / gdb如何报告类群集。 (见下文)在过去,我曾期望看到类似的东西: 通用标签

例如这样(仍会按预期返回): 通用标签

...使用+[NSString pathWithComponents:]创建的字符串。

但是,使用NSSet和以下代码子类: 通用标签

...输出: 通用标签

调试器为所有Set实例显示相同的类。我知道过去Set类集群不会像这样返回。

  1. 发生了什么变化? (我怀疑这是与Core Foundation的桥梁发生的变化。)
  2. 哪个类集群仅报告通用类,例如NSCFSet,并报告实际的子类,例如NSPathStore2?
  3. 最重要的是,在调试时如何确定NSSet群集实例的实际类?
有帮助吗?

解决方案

  1. 最可能与桥接到CF有关的实现详细信息已更改。如果仔细观察,您会发现现在可以在CoreFoundation中找到许多支持各种Foundation类的Objective-C实现。

  2. 另一个实现细节。随着Mac OS X的每个发行版,Foundation类群集的实现都会发生变化(有时会很大,有时会很微妙)。与该实现相关的专用类的确切集合通常是实现灵活的任何特定需求集的结果。合理的最佳解决方案,同时还保留面向公众的类的API合同。

  3. NSCFSet 是实际的类。实例的功能首先取决于您如何分配实例。没有公开的方法可以确定您的集合是可变的还是不可变的。这实际上是故意的;沿着编写大量基于类集群的可变性来改变行为的代码的道路走了,这会导致疯狂。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top