2015-07-02 3 views
3

В нашем проекте Xcode у нас есть несколько целей, которые имеют общий код. Каждая цель включает только те источники, которые фактически используются ею. Поэтому, когда мы используем некоторые методы категории внутри классов, которые разделены между целями, мы должны убедиться, что эта реализация категории также включена во все цели. Xcode не показывает никаких предупреждений во время компиляции или времени ссылки, если мы забудем включить реализацию категории в некоторые из целей. И хлопотно это делать вручную.Предупреждение о компиляции о методе отсутствия категории

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

ответ

2

Категории не связаны автоматически с окончательным двоичным кодом.

Они связаны, если компоновщик находит файл, в котором они определены, используется (что было источником постоянной ошибки несколько раз назад).

Что вы можете сделать, это использовать специальный флаг линкера: «-all_load» и «-ObjC» в настройках Build/Linking/Другие флаги компоновщика

-ObjC нагрузок, все члены статических библиотек архивов которые реализуют Objective-C класс или категорию.

И от этого discussion:

-all_load и -force_load сказать компоновщика, чтобы связать весь статический архив в конечном исполняемым, даже если компоновщик думает, что части архива не используются.

Другой способ я использую, чтобы заставить ссылку модуль должен поместить функцию C в файле:

void _linkWithNBLogClass(void) 
{ 
    NSLog(@"%s", __FUNCTION__); 
} 

и назвать его в начале моего приложения:

linkWithNBLogClass(); 

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

+0

Это не решает его проблему, но просто делает '-ответчикТелектор:' безопасным во время выполнения. (Если я его правильно понял.) –

1

Описанное поведение по назначению и существующий код сломается, если он будет изменен.

Перед формальными протоколами необходимо было объявить методы без их определения. Это было для необязательных методов, т.е. е. для объявления API-делегата. Обычным методом было объявить так называемый informal protocol, состоящий из категории на NSObject, которая никогда не была реализована.

Но если у вас есть реализация категории, конечно, ее полнота проверяется на соответствие интерфейсу категории. (В противном случае вы получите сообщение об ошибке «Определение метода для X».) Таким образом, у вас нет недостающего метода в реализации категории, но отсутствует реализация категории.

Я не думаю, что это большое дело. Вы получите ошибку времени выполнения вместо ошибки времени компиляции и просто добавите реализацию категории к цели.

+0

Спасибо, я понимаю, почему он работает таким образом. Но я действительно хочу, чтобы был какой-то хак или трюк или сторонний скрипт, который проверяет это на время ссылки. – kolyuchiy