NSArray和NSMutableArray之间的区别

时间:2010-08-16 07:36:33

标签: objective-c

您正在使用基础工具使用NSArrays,并且我编写了以下代码

    -(void)simplearrays
{
 NSMutableArray *arr = [NSMutableArray arrayWithCapacity:3];

 for(int i =0;i<3;i++)
 {
  scanf("%d",&arr[i]);
 }
 for(int j =0; j<3;j++)
 {
  printf("\n%d",arr[j]);
 }
}

我的查询是上面的代码在执行时会显示给定的输出,但是一旦应用程序完成执行就会出现错误,表示“无法分配区域”,请你帮忙。

另外我想知道icode博客中NSArray和NSMutable Array之间的区别我已经读过nsarray可以动态调整大小,所以如果NSArray可以动态调整大小,那么为什么要使用NSMutable数组,或者更好的是什么时候使用NSArray?使用NSMutable Array ???

5 个答案:

答案 0 :(得分:6)

NSArray和NSMutableArray是表示数组行为的Foundation类和数据类型。您可以在两个对象中存储任何非基本类型的对象。两者都保留它们存储的对象,并在删除对象或释放数组对象本身时释放对象。 什么时候用哪个?好吧,如果你不可能在数组中添加/删除对象,你应该通过调用一个静态方法并指定要存储的对象来使用NSArray,即:

NSArray *colors = [NSArray arrayWithObjects:@"Red", @"Green", @"Blue", nil];

如果您可能在创建对象后向对象添加/删除对象,则应使用NSMutableArray。您可以创建数组,无论是否指定要存储的初始对象,然后随时在数组中添加/删除对象,即:

NSMutableArray *colors = [[NSMutableArray alloc] init];
[colors addObject:@"Red"];
[colors addObject:@"Green"];
[colors addObject:@"Blue"];
[colors removeObjectAtIndex:0];
NSLog(@"Color: %@", [colors objectAtIndex:1]);
[colors release];

点击此处了解详情:Collections Programming Topics

答案 1 :(得分:6)

Cocoa数组不是C数组。它们是容器对象,与Java向量和数组列表有一些相似之处。

您无法使用C下标语法添加对象或检索它们,您需要向对象发送消息。

-(void)simplearrays
{
    NSMutableArray *arr = [NSMutableArray array]; 
    // arrayWithCapacity: just gives a hint as to how big the array might become.  It always starts out as
    // size 0.

    for(int i =0;i<3;i++)
    {
        int input;
        scanf("%d",&input);
        [array addObject: [NSNumber numberWithInt: input]];
        // You can't add primitive C types to an NSMutableArray.  You need to box them
        // with an Objective-C object
    }
    for(int j =0; j<3;j++)
    {
       printf("\n%d", [[arr objectAtIndex: j] intValue]);
       // Similarly you need to unbox C types when you retrieve them
    }
    // An alternative to the above loop is to use fast enumeration.  This will be
    // faster because you effectively 'batch up' the accesses to the elements
    for (NSNumber* aNumber in arr)
    {
       printf("\n%d", [aNumber intValue]);
    }
}

答案 2 :(得分:1)

如果要在阵列中添加/删除对象,请使用NSMutableArray

如果您只创建包含对象的数组而您不打算修改内容,请使用NSArray

您可以从一个转换为另一个。

答案 3 :(得分:1)

NSArrayNSMutableArray不仅仅是C数组的同义词,它们是具有自己接口的容器对象。如果要将对象插入一个对象,则需要NSMutableArray,并且需要调用addObject:等mutator方法。您不能只使用[]运算符。类似地,为了读出对象 - 你必须经历诸如objectAtIndex:之类的方法。

(请注意,您的代码 sort-of 语法上有效,这就是编译器允许您执行此操作的原因 - 您使用[]取消引用指针。但是它在语义上是非常错误的。它不会做你想要的,并且可能会以潜在的灾难性方式摧毁记忆。)

答案 4 :(得分:0)

基本区别在于您无法向NSArray添加对象。 因此,如果您想要一个要添加对象的数组,则必须使用NSMutable数组。