CFMutableArray超出其容量

时间:2013-10-05 20:58:18

标签: ios cocoa nsarray core-foundation

考虑到我使用以下函数调用创建了CFMutableArray对象:

CFMutableArrayRef marray = CFArrayCreateMutable(kCFAllocatorDefault, 1, &kCFTypeArrayCallBacks);

根据CFMutableArray DocumentationCFArrayCreateMutable的第二个参数(称为capacity)是"新数组可以包含的最大值。数组开始为空,可以增长到这个数量的值(并且可以减少)。 传递0以指定最大容量不受限制。该值不得为负值。"

但是,如果我向我的新数组附加多个值,它会不断增长。我的意思是,如果新数组已经有一个值,并且我用CFArrayAppendValue(marray, newValue)附加一个新数组,则存储该值,并且数组计数变为2,超出其容量。

那么,为什么会这样呢?我误解了文档吗?

2 个答案:

答案 0 :(得分:7)

有趣。我认为你不会误解文档。我将指出CFMutableArrayRef在iOS上使用NSMutableArray是“免费桥接”,因此可以互换。在iOS上[NSMutableArray arrayWithCapacity]不是那么有限,容量基本上是“指导”而不是硬上限。

可能值得提交一份关于该问题的错误报告,可能是文档错误。

更新:只是去展示你...总是,永远,始终遵循最好的文档的格言是源。我通过CMD点击CFArrayCreateMutable来查看源.h文件中的注释....猜测我是对的,因为这表示'容量'是实现可能忽略的提示,因为它显然是这种情况。

@function CFArrayCreateMutable
⋮
@param capacity A hint about the number of values that will be held by the CFArray.
    Pass 0 for no hint. The implementation may ignore this hint,** or may use it to
    optimize various operations. An array's actual capacity is only limited by
    address space and available memory constraints). If this parameter is negative,
    the behavior is undefined.

不要忘记,标题评论是由开发人员编写的,而“docs”是由一些不具有相同知识深度的技术作家编写的。

答案 1 :(得分:3)

来自docs

  

<强> CFArrayAppendValue   向数组添加一个值,为其提供新的最大索引。

     

参数

     

theArray 的   要添加值的数组。 如果theArray是一个容量有限的数组且在此操作之前已满,则行为未定义

所以,我认为你应该只确保不向一个完整的有限容量数组添加一个值,否则行为将 undefined

或者,您可以为0参数传递capacity,以指定最大容量不受限制。

<强>更新

正如@Cliff Ribaudo指出的那样,官方文档和代码文档之间似乎存在矛盾:

  

@param capacity A 提示 关于将要持有的值的数量                   由CFArray。传递0表示没有提示。实施可能                    忽略 此提示,或者可以使用它来优化各种                   操作。阵列的实际容量仅受限于                   地址空间和可用内存限制。)

因此,我们可以假设在线文档已过时,代码文档可能是正确的。