Ari*_*lka 1 iphone syntax objective-c
我正在尝试模仿以下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
Run Code Online (Sandbox Code Playgroud)
我推出了以下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);
Run Code Online (Sandbox Code Playgroud)
首先,我想知道这是否是最佳方式.而且主要是:我找不到以某种"自动"方式释放内存的方法,即以下代码导致iPhone上的运行时异常:
for (int i = 0; i < 10; i++)
{
if (multi[i] != NULL) free(multi[i]);
}
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
这样,如果循环运行多次,您将不会失败.另外,我使用calloc而不是malloc,因为它将所有指针设置为NULL,整数设置为0.第一个参数是所需数组的大小(在您的情况下),第二个参数是类型的大小(所以不需要乘法).