2011-11-23 10 views
6

tengo este código y la necesidad de portarlo a arco, pero no sé cómo: es¿Cómo puedo reemplazar class_createInstance in arc?

 case FIELDTYPE_OBJECT: 
      className = [fieldType substringWithRange:NSMakeRange(2, [fieldType length]-3)]; 
      rel = class_createInstance(NSClassFromString(className), sizeof(unsigned)); 
      Class theClass = [rel class]; 

      if ([rel isKindOfClass:[DbObject class]]) { 
       //Load the record... 
       NSInteger Id = [rs intForColumn:[theClass relationName]]; 
       if (Id==0) { 
        fieldValue = [rel init]; 
       } else {      
        Db *db = [Db currentDb]; 

        fieldValue = [db loadById: theClass theId:Id]; 
       } 
      } 
      break; 

El error:

error: 'class_createInstance' is unavailable: not available in automatic reference counting mode 

Cómo reemplazarlo?

Necesito construir objetos de clase en tiempo de ejecución.

Respuesta

1

Prueba esto:

#include <objc/objc-runtime.h> 
id object = [[NSClassFromString(@"TheClassName") alloc] init]; 
+1

Eso no manejará el parámetro extraBytes para class_createInstance –

+0

¿Esto todavía se requiere cuando se usa alloc init? –

+0

Si el código usa los bytes adicionales, sí. De lo contrario, no –

3

La solución más sencilla es añadir otro archivo que tiene -fno-objc arco fijado en él, y que tiene una función que llama class_createInstance() que el anterior.

1

Crea un archivo separado .h/.c y coloca algo como esto.

id const 
MyCreateInstanceOfClass(Class const class) 
{ 
    id  instance = class_createInstance(class, 0); 
    return instance; 
} 

#include la .h, y lo llaman. No es necesario poner el interruptor -fno-bjc-arc para cada archivo.

Cuestiones relacionadas