#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 не знал, куда его поместить.