He estado jugando con el desarrollo de iPhone por un tiempo, y aunque te parece un poco incómodo cuando eres un desarrollador de .NET "hard core", no es tan malo una vez que te acostumbras.¿Está bien usar malloc()/free() "clásico" en aplicaciones Objective-C/iPhone?
En cada libro que leí sobre Objective-C, solo se habla de retención/liberación (recuento de referencias) para la gestión de la memoria. Como desarrollador de C/C++ antiguo, parece extraño que asignar la forma "normal", utilizando malloc() y libre() solo se menciona en algunas notas a pie de página.
Sé que malloc() y free() funcionan en Objective-C, pero tengo curiosidad si es una práctica común o no. Después de todo, si quiero asignar una matriz de 100 enteros, parece que esta es la manera más eficiente de hacerlo:
int *array = malloc(sizeof(int) * 100);
memset(array,0,sizeof(int) * 100);
// use the array
free(array);
Es este hecho la mejor manera, o debería evitar una gestión sencilla de memoria C?
Me gusta esta respuesta @Nikolai Ruhe. Estaba usando una matriz ed "malloc" como propiedad. Tenía 3 objetos de esta clase, y "liberé" la matriz en dealloc. Sin embargo, después de liberar el primer objeto, obtuve un error "malloc: *** error para el objeto 0x70a60: el puntero se liberó no se asignó" al liberar el segundo? Parece que el malloc se hizo en "nivel de clase", en lugar de "nivel de objeto". El cambio a su solución hizo que esto desapareciera, pero el "comportamiento" de los objetos también cambió. Todavía no estoy seguro por qué. – iPadDeveloper2011
OK, probé esto y, para mi horror, finalmente descubrí que mi "matriz" se llenaba con bits aleatorios. Supongo que los "datos" subyacentes se lanzaron automáticamente antes de que terminara la matriz. Poner un "retener" en los datos solucionó ese problema, pero ahora debo mantener una referencia al objeto "datos", haciendo que esta solución sea menos atractiva. – iPadDeveloper2011
OK @Nikolai Ruhe, esta es una respuesta realmente horrible que desperdició casi todo mi día. Incluso si 'data' es una" variable de objeto ", parece que se libera automáticamente, lo que permite que' array' se llene. La única forma de obtener un comportamiento similar a un malloc parece ser '[retención de datos];', lo que hace que esta sea una respuesta muy engañosa. Una mejor forma de usar 'NSMutableData' sería comenzar con' NSMutableData * data = [[NSMutableData alloc] initWithLength: sizeof (int) * 100]; ' – iPadDeveloper2011