【问题标题】:Getting C-style array from objects of NSArray从 NSArray 的对象中获取 C 样式的数组
【发布时间】:2011-09-05 21:37:41
【问题描述】:

我有一个 NSArray arr。它有一堆 NSNumber 对象。我正在尝试使用 GNU 的 GSL 计算数组的统计分析。 GSL 将参数作为 C 样式的数组。

是否有任何机制可以,例如,对 NSArray 对象中的所有对象运行“intValue”,并将结果转换为 C 样式数组?

我真的不想将 NSArray 的内容复制到 C 样式的数组中,因为它浪费空间和循环,所以我正在寻找替代方案。

【问题讨论】:

    标签: objective-c arrays xcode4 nsarray gsl


    【解决方案1】:

    您所描述的机制——在 NSArray 中的所有对象上运行 intValue 并给出一个 C 风格的数组——似乎与你所描述的“浪费空间和循环”完全相同。如果您需要 C 风格的整数数组,这也是唯一真正的方法。我能想到的最佳方法:

    int *c_array = malloc(sizeof(int) * [yourArray count]);
    [yourArray enumerateObjectsWithOptions:NSEnumerationConcurrent 
                                usingBlock:^(id number, NSUInteger index, BOOL *unused) {
        c_array[index] = [number intValue];
    }];
    

    【讨论】:

    • 我希望可以直接访问内容。
    • 创建一个将传递的数组设置为变量然后重载 [] 运算符的 Objective-C++ 类是否有意义?如果可能的话,我一直在试图弄清楚如何做到这一点。似乎这样至少可以避免分配内存,并且枚举速度会更快一些 - 无需复制,然后迭代读取。直接阅读即可。
    【解决方案2】:

    试试这个:

    id *numArray = calloc(sizeof(id), yourArray.count);
    [yourArray getObjects: numArray range: NSMakeRange(0, yourArray.count)];
    

    这给了你一个 NSNumbers 的 C 数组。为您提供整数的替代方法:

    int *numArray = calloc(sizeof(int), yourArray.count);
    for (int i = 0; i< yourArray.count; i++)
        numArray[i] = [[yourArray objectAtIndex: i] intValue];
    

    没有办法告诉 yourArray 直接返回一个整数的 C 数组。 NSArray 没有它所拥有的内容的概念,除了它们是 id,并且必须在正确的时间保留和释放。它最多可以返回一个 ID 的 C 数组,就像我的第一个示例一样。

    您可以在内部 C 数组中直接编写自己的简单数组类,其中包含整数(或浮点数或双精度数等),但没有用于此的股票类。

    【讨论】:

      猜你喜欢
      • 2012-04-06
      • 2013-12-04
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 2010-11-29
      相关资源
      最近更新 更多