2011-11-23 10 views
6

Ho questo codice e hanno bisogno di portarlo ad arco, ma non so come:Come posso sostituire 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; 

L'errore è:

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

Come sostituirlo?

Ho bisogno di creare oggetti di classe in runtime.

risposta

1

Prova questo:

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

Che non gestirà il parametro extraBytes su class_createInstance –

+0

È ancora necessario quando si utilizza alloc init? –

+0

Se il codice utilizza i byte aggiuntivi, sì. Altrimenti, no –

3

La soluzione più semplice è quella di aggiungere un altro file che ha -fno-objc-arc impostato su di esso, e che ha una funzione che chiama class_createInstance() come sopra.

1

Creare un file separato /.c e inserire qualcosa di simile.

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

#include il .h, e chiamarlo. Non è necessario inserire lo switch -fno-bjc-arc per ogni file.

Problemi correlati