是否应始终使用NSArray和NSMutableArray而不是普通的C数组?

时间:2012-01-15 10:06:44

标签: c# objective-c

我在C#中有一段代码,我在Objective C中重写它。 代码使用的数组很像double []和Point结构数组。 因此,我只需使用C样式数组来存储Objective C double和CGPoint,或者每次使用NSArrays或NSMutableArrays以及NSValue或NSNumber将非对象存​​储在其中时,这是一个很好的做法。

我可以使用普通数组,但是这个数组在运行时会根据大小再次生成,所以我应该使用malloc并自由地完成相同的操作吗?

注意:http://www.codeproject.com/KB/graphics/BezierSpline.aspx

这是C#代码,我试图在Objective C中实现,如果有人有转换代码,请帮帮我。 我试过但是,似乎对我不起作用。

2 个答案:

答案 0 :(得分:2)

您正在从C#转换,在该语言中,您可以拥有两个未装箱的原始类型和结构的数组,例如double盒装类型的数组,例如相当于Obj-C中包含NSNumber的{​​{1}}个对象。

未装箱的double的C#数组(对其他原始类型和结构保持相同)位于Obj-C doubledouble[] NSArray之间 - C#元素是未装箱的(如NSNumber),而数组本身是托管对象(如double[]中所示)。

C#盒装数组相当于NSArray s的NSArray个。

你如何选择?

  • 如果C#代码具有固定大小的未装箱类型数组,则使用(Obj-)C数组。

  • 如果C#代码为盒装类型的不同大小数组,则使用Obj-C NSObject s。

  • 如果您对C ++中的可变大小的未装箱类型数组感到满意,请考虑NSArray

  • 对于其他一切平衡装箱每个元素的成本(10,000 vector s与相同数量的NSNumber s相比具有较高的开销与管理阵列的内存相比(double / mallocfree / alloc与ARC / GC相比。一般而言,但不是绝对规则,未装箱类型的数组最好是C数组,而盒装类型的数组最好是release s。

答案 1 :(得分:1)

虽然使用NS对象通常更好,但是当你拥有“非对象”的集合时,在使用malloc / free管理内存或者将非对象数据强制转换为可存储对象之间需要权衡利弊。记住NSArray等只会存储NSObjects。对于double,您可以使用NSNumber作为容器。对于CGPoint和其他结构,您可以创建新的对象类型或以某种方式强制转换为NSData对象。