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

Tat*_*tat 4 arrays objective-c multidimensional-array

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

int[] anArray;              // declares an array of integers
anArray = new int[10];      // allocates memory for 10 integers
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

ken*_*ytm 10

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

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

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

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

     id x = [array objectAtIndex:i];              // x = array[i];
     [array replaceObjectAtIndex:i withObject:y]; // array[i] = y;
    
    Run Code Online (Sandbox Code Playgroud)

    不能直接下标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对象.int在C(ObjC)中是一个原始的,并且不能存储到NSArray中.你必须入一个NSNumber的通过[NSNumber numberWithInt:0].您可以使用返回整数-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;
      }
    
    Run Code Online (Sandbox Code Playgroud)
  8. 但是ObjC是C的超集.你可以使用普通的10x10 C阵列.

    int arr[10][10];
    
    Run Code Online (Sandbox Code Playgroud)

  • 我不同意"容量领域很少有用".几乎每种语言都有可变的,动态增长的集合,由连续的堆内存支持,如果你知道或者可以估计你需要的大小,那么它被认为是最佳实践和优化来分配这样的集合.这有助于避免在集合需要增长时重新分配后备存储.一个简单的例子是,如果要将C数组复制到NSMutableArray中,则应该初始化NSMutableArray至少具有足够的容量,因为C数组中有元素. (5认同)