2013-05-05 113 views
0

我实施关于实现细节的效率的2D阵列和关注,2D阵列接口应该提供两个基本方法:ObjC二维数组:阵列vs线性阵列vs C数组?

(假设该阵列被固定的大小,指定在创建,所以没有动态尺寸变化)

  1. getObjectAtRow:柱:

  2. setObjectAtRow:柱:

  3. enumerateUsingBlock:^(ID OBJ,NSUIntegerř流,NSUInteger柱,BOOL *停止)

实现:

阵列的阵列(NSMutableArray的)

具有大小rowCount的一个NSMutableArray并在它的每个元素是大小的一个NSMutableArray columnCount,那么getter将获得行数组,然后从行数组获取指定列的对象,setter将使用相同的技术。枚举器使用两个枚举块,一个用于遍历行数组,另一个用于每个行数组,另一个枚举器用于所有对象。

线性阵列(NSMutableArray的)

只具有实际的对象,获取和设置使用将计算指数的一个NSMutableArray:

指数=行* +信息columnCount柱;

枚举穿过线性阵列,并且通过计算行&柱:

行=索引/信息columnCount 柱=指数%信息columnCount

数组c(假设元件是结构不类对象和大小预定义)

,所以我必须:

MyStruct elements[ROW_COUNT][COLUMN_COUNT] 

然后用它在通常的C方式的getter/setter是刚开/设置:

elements[row][column] 

和枚举只用两个for循环

我的顾虑:

  1. 这一个更有效率?我觉得C数组听起来更有效率,但是对于内存管理有些困难,尤其是在使用ARC时?

  2. 哪一个更好?线性数组还是数组?也就是说,在线性数组中进行生产/部门获取/设置对象的速度更快,还是使用数组数组更快?

感谢

回答

0

最快的选项将是C数组,如果你真的关心性能,你不应该把它包在目标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函数中小心(保留新对象,然后释放前一个对象)。您还需要设置您可能需要的任何复制和序列化/反序列化功能,并且需要设置init时的项目。至于ARC,您可以对每个文件进行配置,因此只需将该对象的.m文件禁用即可。