0

我正在实现一个二维数组并关心实现细节的效率,二维数组接口应该提供两个基本方法:

(假设数组是固定大小,创建时指定,所以没有动态大小变化)

  1. getObjectAtRow:列:

  2. setObjectAtRow:列:

  3. enumerateUsingBlock:^(id obj, NSUInteger 行, NSUInteger 列, BOOL *stop)

执行:

数组数组 (NSMutableArray)

拥有一个大小为 NSMutableArrayrowCount且其中的每个元素都是大小为 NSMutableArray 的 NSMutableArray columnCount,然后 getter 将获取行数组,然后从行数组中获取指定列的对象,setter 将使用相同的技术。Enumerator 使用两个枚举块,一个用于遍历行数组,对于每个行数组,另一个枚举器用于所有对象。

线性阵列 (NSMutableArray)

只有一个 NSMutableArray 的实际对象,getter 和 setter 将使用以下方法计算索引:

索引 = 行 * 列数 + 列;

枚举器遍历线性数组,并通过以下方式计算行和列:

行 = 索引 / 列计数 列 = 索引 % 列计数

C 数组(假设元素是结构而不是类对象并且大小是预定义的)

所以我有:

MyStruct elements[ROW_COUNT][COLUMN_COUNT]

然后以通常的 C 方式使用它,getter/setter 只是获取/设置:

elements[row][column]

枚举只是使用两个 for 循环

我的担忧:

  1. 哪个更有效率?我觉得 C 数组听起来更高效,但内存管理是否有点困难,尤其是在使用 ARC 时?

  2. 哪一个更好?线性阵列或阵列阵列?也就是说,进行生产/除法以获取/设置线性数组中的对象是否更快,还是使用数组数组更快?

谢谢

4

1 回答 1

0

最快的选择将是 C 数组,如果您真的关心性能,您不应该将它包装在 Objective C 类中,而是使用 C 结构或直接变量。

但最简单、几乎有效的方法是使用一维NSMutableArray和一些内联包装函数:

inline id getObjectAt( NSMutableArray *o, int row, int col ) {
    return [o objectAtIndex: row * MY_FIXED_WIDTH_HERE + col];
}
inline void setObjectAt( NSMutableArray *o, int row, int col, id value ) {
    return [o replaceObjectAtIndex: row * MY_FIXED_WIDTH_HERE + col withObject: value];
}

这些函数将被内联,但仍有一个 Objective-c 函数查找要执行 ( objectAtIndex/ replaceObjectAtIndex)。通常对性能的影响可以忽略不计;只有在基准测试表明它很重要时才担心它。

对于实现 C 数组:内存管理很容易;只需在 dealloc 函数中为每个元素添加一个循环release,并在函数中小心set(保留新对象然后释放前一个对象)。您还需要设置您可能需要的任何复制和序列化/反序列化功能,以及ingnil时的项目。init至于 ARC,您可以为每个文件配置它,因此只需为此对象的.m文件禁用它。

于 2013-05-06T01:05:48.603 回答