2011-10-18 138 views
1

我想了解如何创建多维的NSMutable数组。我遇到了一些解决方案,但一直未能使它们适用于我,所以我不确定它们的有效性。现在,如果这里只有某人能够帮助我理解如何更好地创建2-D NSMutable阵列,那将非常棒!二维NSMutable阵列和一些思维的NSMutable阵列

转移到下一个问题,我不知道什么时候我应该召唤NSArray/NSMutableArray vs简单地使用C数组。在我处理的特定情况下,我有一个固定的数据类型 ,我想使用(布尔值),这些显然不是对象。 NS和NSMutableArray是为了保存对象,如果我没有错。那么,使用常规的C数组vs vs NSMutable数组是个好主意吗?

在创建二维数组的问题上添加了一个最后的转折点,是否使用NSMatrices比创建二维NSMutable数组更好呢?

感谢和主要高五对所有谁阅读和回答这个问题!

+1

有没有这样的事情作为一个二维'NSArray',但它听起来像你正在从一个实现的假设到你试图解决的问题。如果从另一个方向开始(即通过描述问题空间),您可能会得到更有用的答案。 – jlehr

+0

那么我的目标是创建一个3行3列的2维数组,我可以在其中输入布尔类型的数据并检索值,这是否更好解释? –

+0

一个更有意义的问题可能是何时应该使用C数组而不是NSArray?嵌套数组是用于n维数组的常用习惯用法,NSValue用于存储基本类型。 –

回答

1

要使用NSMutableArrays你需要做下面的代码创建二维数组:

// Create the 2D array 
// array2D is created autoreleased. It should be retained somewhere 
// to keep it around. 
NSMutableArray* array2D = [NSMutableArray array]; 

// Add a NSMutableArray to array2D for each row 
NSUInteger countRows = 8; // Or whatever value you need 
for (NSUInteger i = 0; i < countRows; i++) { 
    NSMutableArray* row = [NSMutableArray array]; 
    [array2D addObject:row]; 
} 

请注意,您可以添加额外的行随时array2D。此外,每一行都以大小0开始 并且为空。可以添加不同数量的元件的每一行,因此 是锯齿状2D阵列,而不是更多的东西等,其将被固定大小 的矩阵(即,M行×N列)

为了在设定的值具体的行和列,你会做到以下几点:

NSUInteger rowIndex = 5; 
NSUInteger columnIndex = 7; 
NSNumber* value = [NSNumber numberWithInt:11]; 

// Get the 6th row 
// Make sure there are 6 rows 
NSUInteger countRows = array2d.count; 
if (countRows >= (rowIndex + 1)) { 
    NSMutableArray* row = (NSMutableArray*)[array2d objectAtIndex:rowIndex]; 
    // Get the 8th column 
    // Make sure there are 8 columns 
    NSUInteger countColumns = row.count; 
    if (countColumns >= (columnIndex + 1)) { 
    // Set the value 
    [row setObject:value atIndex:columnIndex]; 
    } 
} 

您可以通过在的ObjectiveC对象包裹它们存储在NSMutableArrays C型。 可以使用NSNumber将数字转换为对象。 NSNumber也可以包含布尔值 值。指向C结构的指针可以使用NSValue对象进行包装。您也可以创建包装特定Cocoa类型的NSValue对象,例如: 。的CGRect。

int intValue = 1; 
NSNumber* number = [NSNumber numberWithInt:intValue]; 

BOOL boolValue = NO; 
NSNumber* number = [NSNumber numberWithBool:boolValue]; 

NSArrays不可修改。如果你需要添加或删除一个数组的对象,你应该是一个NSMutableArray。否则使用NSArray。

NSMutableArrays和NSArrays保留添加到它们的对象,并取得它们的所有权。当一个对象从NSMutableArray中被移除时,它会被释放以便清理它。当您释放不再需要的NSArray或NSMutableArray时,它们将清除已添加到数组中的任何对象。这使阵列中的对象的内存管理更容易。

您不能将无对象添加到NSArrays和NSMutableArrays。

NSMutableArray是动态调整大小,而C数组不是。这使得处理添加和删除对象到数组更容易。

我会为一组C类型使用C数组,例如,整数即固定大小和 ,其值在编译时是已知的:

int knownConstantValues[] = { 1, 2, 3 }; 

您可能需要使用C数组将数据传递到库用C API,例如OpenGL的。

希望这会有所帮助。

+0

嘿,布赖恩,感谢您的详细解释,有一个问题与您使用在编译时已知值的C数组有关。在我的情况下,二维数组的大小固定在n X n,它是布尔类型。然而,根据用户输入,什么布尔值会进入运行时确定的单元格。这不可能继续吗? –

+0

在这种情况下,您肯定可以使用C数组。这可能是更简单更优雅的解决方案 –

+0

所以这就是我从上面的整个对话中学到的东西:当数组被期望提供最小的功能并且存储基本数据类型与Objective-C对象时,使用c-数组? 谢谢! –