代码之家  ›  专栏  ›  技术社区  ›  Ralph Caraveo

NSARRAY的,原始类型和拳击哦,天哪!

  •  2
  • Ralph Caraveo  · 技术社区  · 15 年前

    我对客观C世界还很陌生,我对.NET/C有着悠久的历史,所以自然我倾向于使用我的C-智慧。

    现在的问题是:我觉得我真的倾向于创造 简单的 Objective-C集合保存基元类型,因为我不喜欢将基元类型包装到对象(即nsnumber)中,然后将其添加到集合(如nsarray)中的整个概念。

    问题是,我完全理解NSARRAY只对物体进行操作。然而,对于我来说,仅仅因为不存在用于处理基元整数的集合,我们就不得不处理装箱基元,这实在是太愚蠢了。

    所以C的人会知道我在过去的.NET时代所说的。一般来说,当泛型还没有出现时,可以使用简单的数组或数组列表。ArrayList基本上强迫您将原始类型装箱,但实际上它是在幕后完成的,而且您为此付出了高昂的成本(从性能方面来说)。

    如果您不能处理性能成本,那么您就推出了自己的自定义集合,或者最终在它们出现时使用了泛型。

    现在,在客观的C世界里,我们不得不再次处理这个问题,但就像苹果的开发者并不真正关心,或者这不是什么大问题。

    所以我的问题是:这里的推荐做法是什么?我是否应该尝试构建自己的自定义Objective-C集合来保存nsinteger?或者,我应该使用一个原生的C数组作为同事的编码员备忘录在这篇博文中建议: NSArray vs. C Array performance

    或者我只是坚持使用苹果的内置收藏,然后咬紧牙关。在构建性能关键型应用程序时,备忘录解释的性能特征值得考虑。

    这篇文章写得很满,但我得把它从胸口取下来。

    4 回复  |  直到 12 年前
        1
  •  2
  •   Alex Deem    15 年前

    我个人建议使用目标C++和STD::vector & lt;& gt;除非你真的需要使用一个原生的目标C容器,这会导致你使用对象。

        2
  •  0
  •   Wevah    15 年前

    如果只保存nsinteger,可以使用常规的C数组吗?

    编辑:如果你这样做是出于性能原因,我觉得这听起来像是一个过早的优化。

        3
  •  0
  •   Chris Suter    15 年前

    我从来没有真正需要整数的动态数组,因为对于我试图解决的问题来说,整数总是一个更好的解决方案。例如,nsdata可以存储一个字节数组,或者如果nsindexset是一组您想要的整数,则可以使用nsindexset。

    您还可以使用cfarraycreate并传递适当的回调函数(如果需要,还可以将其包装在objective-c中)。

    您有什么具体的问题要解决吗?

        4
  •  0
  •   Norman    12 年前

    通过malloc进入“c”数组需要考虑数组所有者的生命周期才能释放它。其他考虑因素,如弧和调整数组大小等,使“包装”方法具有吸引力。我看到“c样式”的唯一原因是项目是端口还是基于探查器结果。如果你决定“包装”,考虑一种方法 NSArray+Primitive 这将创建一个类别,以向nsarray和nsmutablearray添加基本类型功能。