【问题标题】:Creating a dynamic 2D pointer array of NSObjects in Objective C在 Objective C 中创建 NSObjects 的动态 2D 指针数组
【发布时间】:2013-06-18 08:42:55
【问题描述】:

我想使用 C 指针数组存储 NSObjects 的 2D 数组。我阅读了另一个 StackOverflow 问题,它说可以按如下方式执行此操作:

id myArray [10][10];

但是我想动态分配内存,因为我不知道表有多大。

我了解如何为标准 C 变量类型创建二维指针数组,但我不知道如何为 id 类型创建。如果我使用的是 int,我会这样做:

int ** myArray = (int**) calloc (10, sizeof(int*));
for(int i = 0; i<10; i++) {
    myArray[i] = (int *) calloc(10, sizeof(int));
}

任何想法如何使用 id 数据类型执行此操作?

【问题讨论】:

  • 另外,如果我执行 sizeof(id),它会询问我是否要使用看起来不正确的使用 __bridge。
  • 对于您的int 示例,初始调用应该是int **,使用sizeof(int *)。你所拥有的没有多大意义。
  • 谢谢,但我真正的问题是关于专门存储 id 数据类型。有什么想法吗?
  • 有趣的答案并与我正在尝试做的事情有关:stackoverflow.com/questions/11155275/…

标签: objective-c arrays pointers dynamic


【解决方案1】:

如果您使用 ARC(您可能应该使用)创建 id 类型对象的 C 数组将比它的价值更麻烦。你需要callocfree 以通常的方式(非id 方式)数组,并且你需要注释id 对象,如id __strong myArray = …违反直觉但需要确保 myArray 中的元素被正确释放是在释放 myArray 之前将 myArray 的每个元素显式设置为 nil。

所以无论如何,这很麻烦,并且有几个问题需要解决。您应该只使用NSMutableArrays 中的NSMutableArray。使用最新版本的llvm,您仍然可以使用“C 风格”语法访问数组,例如myArray[x][y] = someObject;

【讨论】:

  • 我使用的是 C 数组,因为此代码需要在 UI 线程上每秒多次检查大量数字网格,因此效率非常重要。
  • 你确定NSMutableArray 真的那么低效吗?我的意思是,是的,作为一种通用的东西,它的效率可能会低于使用较低级别 API 编写的单一用途代码,但不要陷入过早的优化陷阱。无论如何,就像我说的,你可以做到这一点。该代码看起来与您的非 ID 代码 sn-p 非常相似。您必须使用 __strong 关键字注释 id 类型,并且必须在释放数组之前将对象显式设置为 nil,例如 myArray[i][j] = nil(适用于所有 ij),以使其工作正确地在 ARC 下。
  • 我同意以上观点;如果速度是一个问题,那么您可能不希望将值编组进出 NSObjects(在 C 数组、NSArray 或其他方式中)。
猜你喜欢
  • 2017-02-07
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2020-12-26
  • 2013-11-26
相关资源
最近更新 更多