2013-05-05 156 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文件禁用即可。