NSClassFromString возвращает ноль - PullRequest
       8

NSClassFromString возвращает ноль

18 голосов
/ 09 февраля 2010

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

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

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

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

Ответы [ 7 ]

38 голосов
/ 16 февраля 2011

Если вы пытаетесь создать экземпляр класса из статической библиотеки, вы должны добавить флаг «-ObjC» в настройку сборки «Другие флаги компоновщика».

30 голосов
/ 09 февраля 2010

Документация для функции гласит :

Возвращаемое значение Объект класса с именем aClassName, или ноль, если нет класса этим имя в данный момент загружено. Если aClassName - ноль, возвращает ноль.

Пример того, как это следует правильно использовать, выглядит следующим образом:

Class dictionaryClass = NSClassFromString(@"NSMutableDictionary");
id object = [[dictionaryClass alloc] init];
[object setObject:@"Foo" forKey:@"Bar"];
4 голосов
/ 19 октября 2016

Это случилось со мной, когда я добавил внешний файл в проект Xcode. Добавление файла .m в Этапы сборки > Исходники компиляции решают проблему.

4 голосов
/ 22 января 2013

Возможно, ваш класс не будет связан, если это единственная ссылка на него.

У меня был фабричный метод для создания экземпляров различных типов подклассов. У фабрики был оператор switch, который перешел к соответствующему подклассу и выделил и инициировал его. Я заметил, что все операторы alloc / init были точно такими же, за исключением имени класса. Таким образом, я смог удалить весь блок переключателей с помощью функции NSClassFromString ().

Я столкнулся с той же проблемой - возвращение было ноль. Это произошло потому, что класс не использовался в другом месте программы, поэтому он не был связан, поэтому его нельзя было найти во время выполнения.

Вы можете решить эту проблему, включив следующее утверждение:

[MyClass class];

Это побеждает всю цель того, чего я пытался достичь, но это может быть все, что вам нужно.

2 голосов
/ 16 июля 2011

Вы также должны убедиться, что класс, который вы пытаетесь создать, включен в проект. Если вы добавили его позже, вам необходимо установить флажок рядом с целевым объектом, который вы строите.

1 голос
/ 09 февраля 2010

Почему бы не разложить все эти звонки? Таким образом, вы можете проверить значения между вызовами:

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];
0 голосов
/ 12 апреля 2011

Я также увидел странность, когда добавление стандартного одноэлементного кода, поддерживаемого Apple, не позволяло загружать класс. Код работал должным образом, затем я добавил синглтон, и внезапно NSClassFromString начал возвращать ноль. Закомментирование одноэлементного кода привело к правильному разрешению NSClassFromString класса. Я не понимаю взаимодействие, но я думаю, что одноэлементная статическая переменная каким-то образом искажалась, чтобы скрыть имя класса ...?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...