Как я могу заменить class_createInstance в дуге? - PullRequest
6 голосов
/ 24 ноября 2011

У меня есть этот код, и мне нужно перенести его на дугу, но я не знаю как:

        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;

Ошибка:

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

Как заменить его?1008 * Мне нужно создавать объекты класса во время выполнения.

Ответы [ 3 ]

3 голосов
/ 07 марта 2013

Самое простое решение - добавить другой файл, для которого установлена ​​-fno-objc-arc, и в котором есть функция, которая вызывает class_createInstance (), как указано выше.

1 голос
/ 18 октября 2013

Создайте отдельные .h / .c файлы и поместите что-то вроде этого.

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

#include .h и вызовите его.Не нужно ставить переключатель -fno-bjc-arc для каждого файла.

1 голос
/ 21 декабря 2011

Попробуйте это:

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