ObjC 2D数组:数组与线性数组和C数组的数组?

时间:2013-05-05 23:26:04

标签: ios objective-c arrays

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

(假设数组是固定大小,在创建时指定,因此没有动态大小更改)

  1. getObjectAtRow:柱:

  2. setObjectAtRow:柱:

  3. enumerateUsingBlock:^(id obj,NSUInteger row,NSUInteger column,BOOL * stop)

  4. 实现:

    数组数组(NSMutableArray)

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

    线性数组(NSMutableArray)

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

    index = row * columnCount + column;

    枚举器遍历线性数组,并计算行和数;专栏:

    row = index / columnCount column = index%columnCount

    C数组(假设元素是struct而不是类对象,大小是预定义的)

    所以我有:

    MyStruct elements[ROW_COUNT][COLUMN_COUNT]
    

    然后以通常的C方式使用它,getter / setter刚刚进入/设置:

    elements[row][column]
    

    和枚举只是使用两个for循环

    我的担忧:

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

    2. 哪一个更好?线性数组或数组数组?也就是说,生成/除法在线性数组中获取/设置对象的速度更快,还是使用数组数组更快?

    3. 由于

1 个答案:

答案 0 :(得分:0)

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

但是,最简单,几乎有效的方法是使用1D 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函数中小心(保留新对象然后释放上一个对象)。您还需要设置您可能需要的任何复制和序列化/反序列化功能,以及nil init时的项目。对于ARC,您可以按文件配置它,因此只需为此对象的.m文件禁用它。