NSPointerArray中的2D数组

时间:2013-02-17 13:06:59

标签: objective-c multidimensional-array calloc

我正在创建许多2D int和float C数组,并且要将它们的指针分配给NSPointerArray。当我用数据创建并填充它们时,一切都很好,但是当我在数组上执行addPointer时,我得到了EXEC_BAD_ACCESS。 Q1-为什么这是错的? Q2-提供访问使用calloc创建的许多2D数组的最佳方法是什么?

- (NSPointerArray *)treeData{
   if (_treeData == nil) {
      _treeData = [[NSPointerArray alloc] init];
      int** VVD = createIntArray(3000,200); 
      [_treeData addPointer:VVD];
   }
  return _treeData; // addеd later to the post, exists in live code
}

供参考

int** createIntArray(int n, int m)
{    
  int i=0;
   int* values = calloc(m*n, sizeof(int));
   int** rows = malloc(n*sizeof(int*));
   for ( i=0; i<n; ++i)
   {
       rows[i] = values + i*m;
   }
   return rows;

}

1 个答案:

答案 0 :(得分:1)

NSPointerArray必须使用正确的选项。默认情况下,他尝试RETAIN传递的指针,因为int **不是NSObject,它崩溃了。 相反,你必须告诉数组不要触摸你添加的内存!使用不透明的内存选项

初始化它

你刚刚调用的init等于initWithOptions: NSPointerFunctionsStrongMemory
你有电话initWithOptions:NSPointerFunctionsOpaqueMemory

#import <Foundation/Foundation.h>

int** createIntArray(int n, int m)
{
    int i=0;
    int* values = calloc(m*n, sizeof(int));
    int** rows = malloc(n*sizeof(int*));
    for ( i=0; i<n; ++i)
    {
        rows[i] = values + i*m;
    }
    return rows;
}

int main(int argc, char *argv[]) {
    @autoreleasepool {
        id _treeData = [[NSPointerArray alloc] initWithOptions:NSPointerFunctionsOpaqueMemory];
        int** VVD = createIntArray(3000,200);
        [_treeData addPointer:VVD];
    }

    NSLog(@"EOF");
}