iPhone & iPad - в том числе класс увеличит бинарный? - PullRequest
3 голосов
/ 26 февраля 2010

У меня есть свой класс, который я часто использую в своих проектах. В этом классе есть несколько методов, но не все они используются в каждом проекте.

У меня такой вопрос: включение этого класса в проект приведет к тому, что проект станет бесполезным, или компилятор просто включит используемые методы?

Я имею в виду, если в моем классе 30 методов, но только 4 используются в данном проекте, будет ли компилятор включать также другие неиспользованные 26 или только 4, используемые в конечном продукте?

Если он включает все, есть ли способ заставить его игнорировать неиспользуемые методы и обрезать двоичный файл до минимума?

Ответы [ 4 ]

4 голосов
/ 26 февраля 2010

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

Из Apple Docs :

Статический компоновщик (ld) поддерживает удаление неиспользуемого кода и блоков данных из исполняемых файлов. Этот процесс (известный как удаление мертвого кода) помогает уменьшить общий размер исполняемые файлы, что в свою очередь улучшает производительность за счет уменьшения памяти след исполняемого файла. Это также позволяет программам успешно связываться когда неиспользуемый код относится к неопределенный символ (вместо результирующего в ссылке ошибка).

Удаление мертвого кода не ограничено удаление только неиспользуемых функций и исполняемый код из двоичного файла. компоновщик также удаляет все неиспользуемые символы и данные, которые находятся в блоках данных. Такие символы могут включать глобальные переменные, статические переменные и строковые данные, среди прочих.

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

4 голосов
/ 26 февраля 2010

Если другие 26 методов имеют код в @implementation, тогда да, они будут использоваться в конечном продукте.

Причина в системе времени выполнения.Даже если вы не использовали эти 26 методов во время компиляции, нет гарантии, что они не будут переданы во время выполнения (помните NSSelectorFromString и -performSelector:).

Я не знаю, есть лиспособ заставить удалить эти коды.(-dead_strip не работает.)

2 голосов
/ 27 февраля 2010

Звучит так, как будто вам нужно провести рефакторинг и переименовать класс большой жирной мамочки.

1 голос
/ 26 февраля 2010

Мой вопрос: включая этот класс на проекте будет раздувать проект с бесполезным кодом или будет компилятор просто включить используемые методы?

Я думаю, вы говорите о включении заголовка и реализации вашего вспомогательного класса. Это увеличит размер двоичного файла. Как указывает jessecurry, компоновщик поддерживает зачистку. Это плохо, поскольку всегда есть вероятность, что кто-то захочет связать с публичным API вашего бинарного файла (к счастью, это не так, поскольку динамическое связывание на iphone не разрешено, но учитывают другие платформы). Но держу пари, что разница в размере слишком незначительна, чтобы быть существенной.

Наибольшее влияние с точки зрения размера обычно имеют ресурсы, которые вы включаете в свое приложение (изображения, строки и т. Д.).

...