【问题标题】:CFMutableArray grows beyond its capacityCFMutableArray 超出其容量
【发布时间】:2013-10-05 20:58:18
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ios cocoa nsarray core-foundation


    【解决方案1】:

    有趣。我认为您没有误解文档。我会指出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.
    

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

    【讨论】:

    • CoreFoundation 是开源的,所以你可以看看实现:opensource.apple.com/source/CF/CF-744.19/CFArray.c。在我看来,capacity 不是 硬限制。 - (似乎CFArrayAppendValue 也调用了-[NSMutableArray addObject:])。
    • 我想这就是我刚刚写的,不是吗?我确实查看了源代码,即 .h 文件中的源代码注释 :)
    • 您的引用是来自头文件的注释,我只是想通过指向实际的实现来确认这一点。
    • 我明白了,肯定源比.h好
    • 我认为您的意思是“最大”而不是“最大”?
    【解决方案2】:

    来自docs

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

    参数

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

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

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

    更新:

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

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

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

    【讨论】:

    • 事实上,所有将值插入到容量有限的数组中的函数似乎都是这样的。看来行为并不像人们所说的那样不确定......感谢您的回答;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2019-03-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多