我可以使用NSMutableArray分配数组大小吗?

时间:2010-04-06 04:53:14

标签: objective-c arrays multidimensional-array

我曾经是一个Java程序员,数组需要第一次声明,如下所示:

int[] anArray;              // declares an array of integers
anArray = new int[10];      // allocates memory for 10 integers

我不知道Objective C,NSMutableArray是否也给了我这个能力。实际上,我想制作一个10 * 10阵列。提前。 我试着这样做:

myArray = [[NSMutableArray alloc] initWithCapacity:10]; 

for (int i=0; i<10; i++) {
    myArray[i] = [[NSMutableArray alloc] initWithCapacity:10]; 
}

但它会发生错误,告诉我不兼容的类型分配。

8 个答案:

答案 0 :(得分:10)

  1. 容量字段很少有用。无论如何,该阵列将按需扩展。

  2. 容量字段只是告诉数组你可以使用多少内存。数组的长度仍为0.

  3. 但是你可以从空增长数组:

     for (int i = 0; i < 10; ++ i)
         [myArray addObject:…];
    
  4. 要读取和写入NSMutableArray中的元素,您需要:

     id x = [array objectAtIndex:i];              // x = array[i];
     [array replaceObjectAtIndex:i withObject:y]; // array[i] = y;
    

    不能直接下标NSArray。

  5. 您的代码有内存泄漏。与Java不同,ObjC不使用GC,除非您明确启用它(并且iPhoneOS上的ObjC没有GC)。 ObjC通过手动引用计数管理内存。基本上你需要确保你不拥有的东西的引用数量在这个过程中没有变化。有关详细信息,请参阅http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

    在你的情况下,[[NSMutableArray alloc] …];创建一个ref count +1对象,然后赋值将接管数组,这意味着你不再拥有它,但ref count不平衡为0 ,因此这个内存将无法正确释放。您需要使用方便的方法(例如[NSMutableArray array…])来创建ref count为0的对象。

  6. NSArray只能存储ObjC对象。 C(ObjC)中的int是一个原语,不能存储到NSArray中。您必须在[NSNumber numberWithInt:0]之前将加入NSNumber。您可以使用-intValue返回整数。

  7. 总而言之,您的代码需要修改为:

      -(NSMutableArray*)get10x10Array {
         NSMutableArray* arr = [NSMutableArray array];
         for (int i = 0; i < 10; ++ i) {
            NSMutableArray* subarr = [NSMutableArray array];
            for (int j = 0; j < 10; ++ j)
               [subarr addObject:[NSNumber numberWithInt:0]];
            [arr addObject:subarr];
         }
         return arr;
      }
    
  8. 但是ObjC是C的超集。你可以使用普通的10x10 C阵列。

    int arr[10][10];
    

答案 1 :(得分:1)

你想要一个10x10阵列 - 什么?

myArray = [[NSMutableArray alloc] initWithCapacity:10]; 

for (int i=0; i<10; i++) {
    myArray[i] = [[NSMutableArray alloc] initWithCapacity:10]; 
}
  

但它出现错误,告诉我   不兼容的类型分配。

因为您无法像这样分配给myArraymyArray 对象,表示数组数据结构。它是一个C数组。

如果你想要一个原始数据类型的10x10数组,你可以像在C中那样声明一个:

int myArray[10][10];

答案 2 :(得分:0)

你想要NSMutableArray + arrayWithCapacity:

请注意,设置初始容量仅仅是一种优化 - 可变阵列根据需要进行扩展。

编辑: 要做10x10案例,

myArray = [[NSMutableArray alloc] initWithCapacity:10]; 

for (int i=0; i<10; i++) {
    NSMutableArray *subArray = [NSMutableArray arrayWithCapacity:10];
    [myArray addObject:subArray];
    for (int j = 0; j<10; j++) {
          [subArray addObject:[NSNumber numberWithInt:0]];
    }
}

注意:

  • 数组会保留添加到其中的对象,因此无需保留subArray
  • 只能将对象(不是像“int”这样的原始类型)添加到NSArray中,因此需要NSNumber numberWithInt:
  • 您使用objectAtIndex:replaceObjectAtIndex:withObject:等方法从NSArray获取/设置值,而不是数组下标([])语法

请参阅Apple引用NSArrayNSMutableArray

答案 3 :(得分:0)

initWithCapacity:是你想要的。它可能看起来像

NSMutableArrat *array = [[NSMutableArray alloc] initWithCapacity:10];

答案 4 :(得分:0)

NSArray个对象具有固定大小,一旦初始化就无法更改。 NSMutableArray个对象可以改变大小。 10×10阵列有时实现为NSArray,包含10个单独的NSArray个对象,每个对象包含10个项目。这很快变得很麻烦,有时候更容易回到普通C来完成这样的任务:

int tenByTen[10][10];

或者,您可以使用:

typedef struct
{
    int y[10];
} TenInts;

typedef struct
{
    TenInts x[10];
} TenByTen;

然后你可以这样做:

- (void) doSomethingWithTenByTen:(const TenByTen) myMatrix
{
    NSLog ("%d", myMatrix.x[1].y[5]);
}

你也可以从方法中返回它们:

- (TenByTen) mangleTenByTen:(const TenByTen) input
{
    TenByTen result = input;
    result.x[1].y[4] = 10000;
    return result;
}

答案 5 :(得分:0)

您无法使用括号表示法访问Cocoa数组对象。你的第二段代码应该是:

NSMutableArray *myArray = [[NSmutableArray alloc] initWithCapacity:10];
for (int i = 0; i < 10; i++) {
    [myArray insertObject:[NSMutableArray arrayWithCapacity:10] atIndex:i];    // Note: not using myArray[i]!
}

答案 6 :(得分:0)

有两种方法可以做到这一点。

普通老C

如果要存储对象,则应使用id类型而不是int

int myarray[10][10];
myarray[5][2] = 412;

目标C

NSArray并不意味着没有对象的空间,如果你需要它们你可以使用[NSNull null],但如果是这样的话,那么C数组会更好。

NSMutableArray *myArray = [[NSMutableArray alloc] initWithCapacity:10]; 

for (int i=0; i < 10; i++) {
    NSMutableArray *innerArray = [[NSMutableArray alloc] initWithCapacity:10];
    for (int j=0; j < 10; j++) {
        [innerArray addObject:[NSNull null]];
    }
    [myArray addObject:innerArray];
    [innerArray release];
}

[[myArray objectAtIndex:5]
      replaceObjectAtIndex:2 withObject:[NSNumber numberWithInteger:123]];

答案 7 :(得分:0)

创建后,您可以使用以下代码调整NSMutableArray的大小:

@interface NSMutableArray (Resizing)
- (NSMutableArray *)resize:(NSInteger)newSize;
@end

@implementation NSMutableArray (Resizing)
- (NSMutableArray *)resize:(NSInteger)newSize
{
    int size = (newSize > [self count]) ? self.count : newSize;
    NSMutableArray *array = [NSMutableArray arrayWithCapacity:size];
    for (int i = 0; i < size; i++){
        [array addObject:[self objectAtIndex:i]];
    }   
    return array;
}
@end