Я получаю нулевой класс с помощью NSClassFromString

#objective-c

#objective-c

Вопрос:

У меня один и тот же код, общий для 2 приложений, и в зависимости от текущего приложения используется другой класс.

className — это строка, которая может быть «PrefixClass1» или «PrefixClass2» (и это правильно для обоих приложений, я проверил в отладчике).

Однако currentClass имеет значение null для app2. (Это отлично работает для app1)

 NSString *className = [NSString stringWithFormat:@"Prefix%@", [[NSApp delegate] applicationName]];
Class currentClass = NSClassFromString(className);
  

Это означает, что значение null верно? http://cl.ly/AYSn

Спасибо

Комментарии:

1. вы импортировали заголовок class2?

2. @d.lebedev Я не вижу никакого импортированного заголовка, я также не вижу заголовка class1. Возможно, мне следует проверить суперклассы, но я не думаю, что найду их, потому что я нахожусь в базовом коде (без классов, специфичных для приложения).

3. Кстати, есть ли способ просмотреть все импортированные заголовки из всех суперклассов определенного класса в компиляторе? Или я должен искать их вручную?

4. Вероятно, вам придется искать вручную

5. @d.lebedev Я искал #import «class1.h» и #import «class2.h». Таких строк нет (конечно, рядом с соответствующими файлами реализации. Но class1 работает, поэтому кажется, что нет необходимости импортировать заголовок класса.

Ответ №1:

1.) убедитесь, что вы действительно используете правильное имя класса и NSString (синтаксис @»class2″)

2.) добавьте флаг компоновщика «-all_load» в настройки сборки (если компоновщик не находит ссылок, класс может не загружаться в среду выполнения)

Комментарии:

1. Строка правильная. Я проверил это. И это один и тот же код для обоих приложений, который создает строку (просто строка над строкой, которую я опубликовал.

2. Кроме того, я добавил флаг, который вы предлагаете, но безуспешно.. класс равен нулю: cl.ly/AZF8

3. что [PrefixClass2 class] возвращает жестко заданный результат? и если он возвращает объект, возвращает ли NSClassFromString также значение?

4. Я решил проблему, добавив новый файл PrefixClass2.m в раздел target> Compile Sources .

5. Честно говоря, я немного разочарован, потому что очистка встроенных, удаление встроенных папок не решили проблему. Мне пришлось вручную добавить новый файл .m в исходные коды компиляции. И причина, вероятно, в том, что я перетащил его с рабочего стола. Не могли бы вы подтвердить это?

Ответ №2:

Я решил проблему, добавив файл .m в цель> Скомпилировать исходные коды… Поскольку у меня было много целей, xCode не знал, куда его поместить.