2013-11-29 1 views
0

ВОПРОС 1Можно определить классы для импорта во время выполнения/Возможно игнорировать ошибки импорта?

Я 99% уверен, что вы не можете определить, какие другие классы импортирует класса во время выполнения ... но только в том случае, ... это то, что вы можете сделать?

ВОПРОС 2

Можно ли иметь ваше приложение игнорировать ошибку импорта? I.e., есть ли способ сделать ваше приложение все еще компилироваться и запускаться, даже если вы включаете #import "IrrelevantClass.h" и не включаете IrrelevantClass.h/.m в свой проект Xcode?

(ЧТО Я клоню ...)

Я создал пользовательский класс RulesManager.h/.m с некоторыми обобщенными методами для принятия соответствующих мер, основанных на данные правила класса RulesManager_<ProjectName>.h/.m, где каждый Xcode проект имеет свой собственный класс правил. (Давайте использовать проект Xcode MyProject в качестве примера, так что наши два файла будут RulesManager.h/.m и RulesManager_MyProject.h/.m.)

В настоящее время, RulesManager_MyProject.h импорт RulesManager.h, и все мои занятия в моем импорте проекта RulesManager_MyProject.h, так что мои классы могут назвать что-то вроде [RulesManager shouldExecuteGivenParameters:parameters rulesClass:rulesClass] и предпринять соответствующие действия, учитывая как предоставленные параметры, так и статические правила, описанные в классе правил, в данном случае RulesManager_MyProject.m. (Надеюсь, что это не слишком запутывало ...)

Однако, вместо импорта RulesManager_MyProject.h во все мои файлы проекта, я хотел бы импортировать RulesManager.h во все классы моего проекта и получить файл правил через что-то вроде NSClassFromString([NSString stringWithFormat:@"RulesManager_%@", [[[[NSBundle mainBundle] bundleIdentifier] componentsSeparatedByString:@"."] lastObject]]). Однако это не работает, потому что вам нужно помнить, чтобы импортировать файл явно через #import "RulesManager_MyProject.h" перед компиляцией. «Альтернативная» идея состояла бы в том, чтобы импортировать все соответствующие файлы RulesManager_<ProjectName>.h в каждом классе, но затем вы получите проблему в вопросе 2 выше.

Причина, по которой я хочу сделать что-то подобное, так что я могу повторно использовать класс RulesManager.h/.m во всех моих проектах Xcode (без копирования) и повторно использовать мои классы, которые используют диспетчер правил (опять же, без копирования), а вместо этого упростите вызов моего метода на что-то вроде [RulesManager shouldExecuteGivenParameters:parameters] и будут иметь значение rulesClass на основе текущего проекта Xcode.

Что приятно об этой реализации является то, что у меня есть уникальный центральный файл (RulesManager_<ProjectName>.h/.m) в каждом проекте Xcode, где можно указать уникальные правила проекта в масштабах (например, для отладки), а также иметь класс общего между проектами (RulesManager.h/.m) для реализации логики этих правил.

ответ

1

Q1. Строго говоря, это даже не имеет смысла, класс ничего не импортирует. Файл может импортировать другие файлы, но (в объективе-c) эти файлы могут иметь произвольный контент, несколько классов, только часть класса и т. Д. Несмотря на это, во время выполнения вы не можете указать, что произошло отсюда (кроме, возможно, собственный двоичный код и проверка символов отладки? Даже тогда я не думаю, что вы можете сказать, что импортировало что).

Q2. Нет, ошибка является ошибкой, потому что компилятор (на самом деле препроцессор здесь) не может восстановить его. В противном случае вы получите предупреждения (если вы не используете -Werror или пару других вариантов clang).

Я хочу импортировать RulesManager.h во все классы моего проекта и получить файл правил через что-то вроде NSClassFromString([NSString stringWithFormat:@"RulesManager_%@", [[[[NSBundle mainBundle] bundleIdentifier] componentsSeparatedByString:@"."] lastObject]]). Однако это не работает, потому что вам нужно помнить, чтобы импортировать файл явно через #import "RulesManager_MyProject.h" перед компиляцией.

Вы пробовали? В Objective-C классы разрешаются во время выполнения, поэтому вы можете использовать класс, о котором компилятор не знает. Это плохо для типа и безопасности имен, но вы можете это сделать. import сообщает компилятору, что он должен обрабатывать указанный файл, который обычно (в objc) содержит @interface, который сообщает компилятору, что ему нужно для проверки типов и безопасности имен.

+0

Спасибо! Я не понимал, что вы все равно можете вызвать класс, явно не «импортируя» его через '# import'. В какой-то момент мне бы хотелось/я должен * на самом деле * прочитать о том, как работает Obj-C, а не просто использовать его. –

Смежные вопросы