Подтвердить что ты не робот

NSClassFromString возвращает nil

Почему NSClassFromString возвращает nil? В соответствии с определением он должен возвращать имя класса. Как мне позаботиться об устранении этой проблемы? Мне нужно создать экземпляр класса из строки и вызвать метод, который находится в классе, используя созданный экземпляр.

Вот как выглядит мой код:

id myclass = [[NSClassFromString(@"Class_from_String") alloc] init];
[myclass method_from_class];

Но функция method_from_class не вызывается, управление не входит в нее. И мой код без ошибок. Любая идея, как решить это в Objective-C?

4b9b3361

Ответ 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 каким-то образом искалечен, чтобы скрыть имя класса...?