У меня есть проект с библиотечным подпроектом, который импортируется.У меня есть доступ к исходному коду основного проекта и подпроекта.
В подпроекте используется Core Text.Поскольку подпроект должен использоваться в приложениях до и после версии 3.2, Core Text слабо связан, и весь связанный с Core Text код обернут в логику:
#if defined(__CORETEXT__) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
Идея этой строки кода заключается в том, чтоесли CoreText не связан, код пропускается.Если версия iPhone меньше 3.2;CoreText не связан с.
Причина этой цели заключается в том, что основной (ые) проект (ы) не все используют Core Text, а если нет, то без 'определенные (*)1008 * CORETEXT ) `, они не будут компилироваться.
Этот кажется работает нормально, и все компилируется без ошибок в проектах, использующих Core Text.Однако при выполнении код не найден, и во время выполнения появляется ошибка «NSString не отвечает на XXXX» (часть кода относится к категории NSString
).
Кто-нибудь сталкивался с этим?Мой вопрос, частично расплывчатый, из-за того, что он работает с клиентом, понятен?
В идеале я хочу настроить это так, чтобы подпроект не нужно было изменять, когда основной проект использует Core Text, а когда нет.
Обратите внимание, что __CORETEXT__
определено в заголовке платформы Core Text.
Обновление по проблеме
Я попробовал предложенные предложения, и они неэффективны,Возможно, немного больше кода поможет обрисовать проблему.У меня есть категория со следующим заголовком:
@interface NSString (Internal)
- (NSString *)stringByUnescapingEntities;
- (NSString *)flattenHTML;
- (NSString *)flattenHTMLAndParseParagraphBreaks:(BOOL)parseBreaks;
- (NSString *)stringByEscapingForURL;
- (NSString *)stringByEscapingForJSON;
#if defined(__CORETEXT__) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
- (CFAttributedStringRef)attributedStringFromHTML;
- (CFAttributedStringRef)attributedStringFromHTMLWithBaseAttributes:(NSDictionary*)baseAttributes;
#endif
@end
Положительный тест
Все методы за пределами блока #if
работают отлично.Все методы внутри #if
компилируют отлично, без предупреждений.
Отрицательный тест
Если я изменю __CORETEXT__
на что-то вроде __THIS_IS_NOT_REAL__
, я получу ошибку компиляции для методов внутри блока.Поэтому я знаю, по крайней мере, во время компиляции, что флаг __CORETEXT__
определен и полностью функционален.
Проблема времени выполнения
Однако, когда я обращаюсь к одному из объявленных методоввнутри блока #if я получаю следующую ошибку во время выполнения:
- [NSCFString attribuStStringFromHTMLWithBaseAttributes:]: нераспознанный селектор, отправленный экземпляру 0x689c000
Экземпляр 0x689c000
будучи NSString
.
Если я уберу проверку логики __CORETEXT__
, то все будет работать, пока главный проект использует Core Text.Если мастер-проект не использует Core Text, появляются ошибки компиляции с отсутствующими компоновщиками.
Надеемся, что это решает проблему.
ПРИМЕЧАНИЕ: Все проекты используют -all_load
флаг;как это было необходимо для TouchXML
уже.
Я создал тестовый проект, который демонстрирует проблему.
Тестовый проект