2012-07-11 13 views
7

¿Cómo podría reescribir la siguiente clase de utilidad para obtener todos los valores de cadena de clase para un tipo específico - usando las funciones de tiempo de ejecución de Objective-c como se muestra a continuación?realloc() & ARC

La documentación ARC establece específicamente que realloc debe ser evitado y también me sale el siguiente error del compilador en este esta línea:

classList = realloc(classList, sizeof(Class) * numClasses); 

"conversión implícita de un tipo de puntero no Objective-C 'void * 'to' __unsafe_unretained Class * 'no se permite con ARC "

El siguiente código es una referencia al artículo original que se puede encontrar here.

+ (NSArray *)classStringsForClassesOfType:(Class)filterType { 

    int numClasses = 0, newNumClasses = objc_getClassList(NULL, 0); 
    Class *classList = NULL; 

    while (numClasses < newNumClasses) { 
     numClasses = newNumClasses; 
     classList = realloc(classList, sizeof(Class) * numClasses); 
     newNumClasses = objc_getClassList(classList, numClasses); 
    } 

    NSMutableArray *classesArray = [NSMutableArray array]; 

    for (int i = 0; i < numClasses; i++) { 
     Class superClass = classList[i]; 
     do { 
      superClass = class_getSuperclass(superClass); 
      if (superClass == filterType) { 
       [classesArray addObject:NSStringFromClass(classList[i])]; 
       break; 
      }   
     } while (superClass);  
    } 

    free(classList); 

    return classesArray; 
} 

Su ayuda será muy apreciada.

+0

Realice un lanzamiento explícito (void *) classList. También considere no usar realloc. ¿Qué estás tratando de lograr aquí? – Dustin

+2

¿Realmente necesita ejecutar el código con ARC, o sería aceptable que ejecute el código en modo no ARC (indicador '-fno-objc-arc' en la configuración de generación de destino para las clases donde desea desactivar ARC). Ver: http://stackoverflow.com/questions/6646052/how-can-i-disable-arc-for-a-single-file-in-a-project –

+0

@WolfgangSchreurs Gracias, me olvidé por completo de la opción del indicador del enlazador . – RynoB

Respuesta

13

ARC le obliga a ser más explícito con su gestión de memoria. En este caso, solo necesita emitir explícitamente la salida de realloc:

classList = (Class *)realloc(classList, sizeof(Class) * numClasses); 
+0

¡Gracias, esto era exactamente lo que estaba buscando! – RynoB

+0

Gracias por ahorrar horas de frustración. –