5

考虑我有一个CFMutableArray使用以下函数调用创建的对象:

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

根据CFMutableArray 文档CFArrayCreateMutable,被称为的第二个参数capacity是“新数组可以包含的值的最大数量。数组开始为空,可以增长到这个值的数量(并且可以更少) . 传0表示不限制最大容量。该值不能为负数。"

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

那么,为什么会发生这种情况?我误解了文档吗?

4

2 回答 2

8

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

可能值得为此提交一个错误报告,可能文档是错误的。

更新:只是去向你展示......永远,永远,永远遵循最好的文档的格言是来源。我单击 CMDCFArrayCreateMutable以查看源 .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.

不要忘记,标题注释是由开发人员编写的,而“文档”是由一些知识深度不同的技术作家编写的。

于 2013-10-05T21:18:16.287 回答
3

来自文档

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

参数

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

所以,我认为你应该只确保不要向完整的有限容量数组添加值,否则行为将是未定义的!

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

更新:

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

@param capacity关于CFArray将保存的值数量的提示。传递 0 表示没有提示。实现可以 忽略这个提示,或者可以使用它来优化各种操作。数组的实际容量仅受地址空间和可用内存限制)。

所以我们可以假设在线文档已经过时并且代码文档可能是正确的。

于 2013-10-05T21:21:59.920 回答