Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否应始终使用NSArray和NSMutableArray而不是普通的C数组?_C#_Objective C - Fatal编程技术网

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

C# 是否应始终使用NSArray和NSMutableArray而不是普通的C数组?,c#,objective-c,C#,Objective C,我有一段C语言的代码,我正在用Objective C重写它。 代码使用的数组非常类似于double[],还使用点结构数组。 那么,我应该简单地使用C样式的数组来存储任务的Objective C double和CGPoint,还是每次都使用NSArray或NSMutableArray以及NSValue或NSNumber来存储其中的非对象是一种好的做法 我可以很好地使用普通数组,但是这个数组是根据大小在运行时生成的,所以我应该使用malloc和free来完成同样的任务吗 注: 这是C代码,我正试图用

我有一段C语言的代码,我正在用Objective C重写它。 代码使用的数组非常类似于double[],还使用点结构数组。 那么,我应该简单地使用C样式的数组来存储任务的Objective C double和CGPoint,还是每次都使用NSArray或NSMutableArray以及NSValue或NSNumber来存储其中的非对象是一种好的做法

我可以很好地使用普通数组,但是这个数组是根据大小在运行时生成的,所以我应该使用malloc和free来完成同样的任务吗

注:

这是C代码,我正试图用Objective C实现,如果有人有转换后的代码,请帮助我。
我试过了,但似乎对我不起作用

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

您正在从C#转换,在该语言中,您可以同时拥有未装箱的基本类型和结构的数组,例如,
double
,以及装箱类型的数组,例如,相当于Obj-C中包含双代号的对象

未装箱的
double
s的C#数组(对其他基本类型和结构也适用)介于Obj-C
double[]
NSNumber
NSArray
之间-在C#中,元素是未装箱的(如
double[]
),而数组本身是一个托管对象(如
NSArray

C#装箱数组相当于
NSObject
s的
NSArray
s

你怎么选择

  • 如果C#代码具有固定大小的非固定类型数组,请使用(Obj-)C数组

  • 如果C#代码作为装箱类型的可变大小数组使用Obj-C
    NSArray
    s

  • <> >如果您对C++的满意,对于大小可变的未装箱类型数组,请考虑<代码>向量< /> >

  • 对于其他所有内容,平衡装箱每个元素的成本(10000个NSNumbers与相同数量的doubles相比,开销较高)与管理阵列的内存(
    malloc
    /
    free
    alloc
    /
    release
    与ARC/GC)。一般来说,但不是绝对规则,未装箱类型的数组最好与C数组一样,而装箱类型的数组最好与
    NSArray
    s一样


我会使用NS类,因为您可以像在普通阵列上一样对它们执行更多操作。在类引用中,你可以看到什么(你)也可以使用Object C++,使用STD::vector,这样内存管理就可以“box”(包在对象中的标量)CGPoT和其他任意C标量(和POD C++对象),使用的类是NSValue。请再次检查问题中的更改以及链接,并告诉我是否可以直接转换。