当前位置:  开发笔记 > IOS > 正文

在Objective-C中使用指针数组的最佳方法是什么?

如何解决《在Objective-C中使用指针数组的最佳方法是什么?》经验,为你挑选了1个好方法。

我正在尝试模仿以下Java代码:

int[][] multi; // DIMENSIONS ARE UNKNOWN AT CREATION TIME
// LATER ON...
multi = new int[10][];
multi[5] = new int[20];
multi[5][11] = 66;
// LATER ON...
multi = null; // PROPER WAY OF FREEING EVERYTHING

我推出了以下Objective-C版本:

int* *multi;
//
multi = malloc(10 * sizeof(int*));
multi[5] = (int *) malloc(20 * sizeof(int));
multi[5][11] = 66;
//
free(multi[5]);
free(multi);

首先,我想知道这是否是最佳方式.而且主要是:我找不到以某种"自动"方式释放内存的方法,即以下代码导致iPhone上的运行时异常:

for (int i = 0; i < 10; i++)
{
    if (multi[i] != NULL) free(multi[i]);
}

Jason Coco.. 7

Free不会将指针中的内存地址清零,只会使其无效.因此,如果您不止一次运行此循环,则在尝试释放已经失效的内存时会出现异常.您可以使用NSPointerArray或将整数包装在对象中并使用NSMutableArray用于您的目的,但如果您只想使用您拥有的,并且您不止一次运行循环,则必须执行以下操作:

int **multi;
multi = calloc(10, sizeof(int*));
multi[5] = calloc(20, sizeof(int));
//
multi[5][11] = 66;
//
for( int i = 0; i < 10; i++ ) {
  if( multi[i] ) {
    free(multi[i]);
    multi[i] = NULL;
  }
}
//
free(multi);

这样,如果循环运行多次,您将不会失败.另外,我使用calloc而不是malloc,因为它将所有指针设置为NULL,整数设置为0.第一个参数是所需数组的大小(在您的情况下),第二个参数是类型的大小(所以不需要乘法).



1> Jason Coco..:

Free不会将指针中的内存地址清零,只会使其无效.因此,如果您不止一次运行此循环,则在尝试释放已经失效的内存时会出现异常.您可以使用NSPointerArray或将整数包装在对象中并使用NSMutableArray用于您的目的,但如果您只想使用您拥有的,并且您不止一次运行循环,则必须执行以下操作:

int **multi;
multi = calloc(10, sizeof(int*));
multi[5] = calloc(20, sizeof(int));
//
multi[5][11] = 66;
//
for( int i = 0; i < 10; i++ ) {
  if( multi[i] ) {
    free(multi[i]);
    multi[i] = NULL;
  }
}
//
free(multi);

这样,如果循环运行多次,您将不会失败.另外,我使用calloc而不是malloc,因为它将所有指针设置为NULL,整数设置为0.第一个参数是所需数组的大小(在您的情况下),第二个参数是类型的大小(所以不需要乘法).

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有