0

所以我得到了一个 NSzombie,上面写着这个

-[__NSArrayI _cfTypeID]:消息发送到释放的实例

知道那是什么吗?大概是一个数组,虽然我想如果它是一个 NS 类型它会说。

4

2 回答 2

3

是的——那将是某种类型的数组。大多数基础类型不是单个类,而是类簇。因此,您初始化数组的确切方式会影响NSArray您返回的子类。

确切的行为是未记录的,并且基本上保证会随着时间而改变,但是例如,如果您创建了一个具有少于一定数量的条目的不可变数组,那么系统可能会决定返回单个链接数组并将搜索作为简单的线性搜索执行。如果您在阈值之上创建一个,那么它可能会创建一个数组,该数组添加了某种用于搜索的分层逻辑(或者,更有可能包含在用户开始尝试搜索数组时创建合适的分层表的逻辑)。

相关课程学习:

  • 永远不要尝试子类化基础类;
  • 不要期望isMemberOfClass:能正常工作;
  • 甚至不必期望isKindOfClass:能够从基础类的可变版本中区分不可变。

Apple 需要一种方法来区分这些类并将它们标记为私有,因此您最终会使用下划线和后缀。在实践中,我认为__NSArrayI是一个普通的不可变数组。

于 2012-11-12T03:32:55.947 回答
1

基本上这意味着您的NSArray对象已经被释放。有些东西Foundation.framework试图访问你NSArray的私有方法_cfTypeID并崩溃了。

关于为什么对象中有_cfTypeID方法的问题NSArrayNSArray核心基金会对应的CFArray. 两种类型的可与“免费桥”互换。所以实际上苹果将这种方法用于内部使用。如果您想更深入地了解这一点。您可以访问http://code.google.com/p/cocotron/source/browse/Foundation/NSArray/NSArray.m,这是 Cocotron 的 NSArray 实现。它与苹果的实现不一样,但仍然是相似的。

于 2012-11-12T03:41:36.937 回答