NSClassFromString возвращает nil
Почему NSClassFromString
возвращает nil
? В соответствии с определением он должен возвращать имя класса.
Как мне позаботиться об устранении этой проблемы? Мне нужно создать экземпляр класса из строки и вызвать метод, который находится в классе, используя созданный экземпляр.
Вот как выглядит мой код:
id myclass = [[NSClassFromString(@"Class_from_String") alloc] init];
[myclass method_from_class];
Но функция method_from_class
не вызывается, управление не входит в нее. И мой код без ошибок. Любая идея, как решить это в Objective-C?
Ответы
Ответ 1
Документация для функции говорит:
Возвращаемое значениеОбъект класса, названный aClassName или nil, если нет класса имя загружается. Если aClassName - nil, возвращает nil.
Пример того, как это должно быть правильно использовано, выглядит следующим образом:
Class dictionaryClass = NSClassFromString(@"NSMutableDictionary");
id object = [[dictionaryClass alloc] init];
[object setObject:@"Foo" forKey:@"Bar"];
Ответ 2
Если вы пытаетесь создать экземпляр класса из статической библиотеки, вы должны добавить флаг "-ObjC" в настройку сборки "Другие компоновщики флагов".
Ответ 3
Возможно, ваш класс не связан, если это единственная ссылка на него.
У меня был метод factory для создания экземпляров различных типов подкласса. factory имел оператор switch, который перешел в соответствующий подкласс и alloc'd и инициализировал его. Я заметил, что все операторы alloc/init были точно такими же, за исключением имени класса. Таким образом, я смог исключить весь блок коммутатора, используя функцию NSClassFromString().
Я столкнулся с той же проблемой - возврат был равен нулю. Это объясняется тем, что класс не использовался в другом месте программы, поэтому он не связывался, поэтому его нельзя было найти во время выполнения.
Вы можете решить эту проблему, включив следующую инструкцию:
[MyClass class];
Это побеждает всю цель того, что я пытаюсь выполнить, но это может быть все, что вам нужно.
Ответ 4
Это произошло со мной, когда я добавляю внешний файл в проект Xcode. Добавление файла .m в Сборка фаз > Скомпилировать источники решить проблему.
Ответ 5
Вам также необходимо убедиться, что класс, который вы пытаетесь создать, включен в проект. Если вы добавили его позже, вам нужно установить флажок рядом с создаваемой вами целью.
Ответ 6
Почему бы не разложить все эти вызовы? Таким образом, вы можете проверить значения между вызовами:
Class myclass = NSClassFromString(@"Class_from_String");
id obj = [[myclass alloc] init];
[obj method_from_class];
Кстати, method_from_class
метод экземпляра или метод класса? Если это позже, вы можете напрямую вызвать method_from_class
по значению myclass
:
[myclass method_from_class];
Ответ 7
Я также видел странность, когда добавление стандартного одноэлементного кода, поддерживаемого apple, предотвращало загрузку класса. Код работал так, как ожидалось, затем я добавил синглтон, и вдруг NSClassFromString начал возвращать нуль. Комментируя одноэлементный код, в NSClassFromString было правильно разрешено класс. Я не понимаю взаимодействия, но я думаю, что singleton static var каким-то образом искалечен, чтобы скрыть имя класса...?