iPhone и iPad – включение класса увеличит двоичный код?
-
23-09-2019 - |
Вопрос
У меня есть собственный класс, который я часто использую в своих проектах.Этот класс имеет несколько методов, но не все из них используются в каждом проекте.
Мой вопрос:включение этого класса в проект приведет к раздуванию проекта бесполезным кодом или компилятор просто включит используемые методы?
Я имею в виду, что если в моем классе 30 методов, но в данном проекте используются только 4, будет ли компилятор включать еще и остальные неиспользуемые 26 или только 4, использованные в конечном продукте?
Если он включает все, есть ли способ заставить его игнорировать неиспользуемые методы и сократить двоичный файл до минимума?
Решение
Компоновщик поддерживает зачистка, если вы включите его, неиспользуемый код не должен вызывать раздувания.
Из Документы Apple:
Статический линкер (LD) поддерживает удаление неиспользованного кода и блоков данных из исполняемых файлов.Этот процесс (известный как снятие мертвого кода) помогает уменьшить общий размер исполняемых файлов, что, в свою очередь, повышает производительность за счет уменьшения следа памяти исполняемого файла.Это также позволяет программам успешно ссылаться, когда неиспользованный код относится к неопределенному символу (вместо того, чтобы привести к ошибке ссылки).
Снижение мертвого кода не ограничивается удалением только неиспользованных функций и исполняемого кода из двоичного файла.Линкер также удаляет любые неиспользованные символы и данные, которые находятся в блоках данных.Такие символы могут включать глобальные переменные, статические переменные и строковые данные, среди прочего.
При включении зачистки мертвого кода, статический линкер ищет код, который недоступен от начального набора живых символов и блоков.
Другие советы
Если остальные 26 методов имеют код @implementation
, тогда да, они будут использованы в конечном продукте.
Причина в системе времени выполнения.Даже если вы не использовали эти 26 методов во время компиляции, нет никакой гарантии, что они не будут использоваться во время выполнения (помните NSSelectorFromString
и -performSelector:
).
Я не знаю, есть ли способ принудительно удалить этот код.(-dead_strip
не работает.)
Похоже, вам нужно провести рефакторинг и переименовать класс большой толстой мамы.
Мой вопрос:Включение этого класса в проект разбудит проект с бесполезным кодом, или компилятор будет только включать используемые методы?
Я думаю, вы говорите о включении заголовка и реализации вашего вспомогательного класса.Это увеличит размер двоичного файла.Как отметил jessecurry, компоновщик поддерживает тупиковое удаление.Это плохо, поскольку всегда есть вероятность, что кто-то захочет связать общедоступный API вашего двоичного файла (к счастью, это не так, поскольку динамическое связывание не разрешено на iPhone, но рассмотрите возможность использования других платформ).Но я уверен, что разница в размерах слишком незначительна, чтобы быть значительной.
Наибольшее влияние на размер обычно оказывают ресурсы, которые вы включаете в свое приложение (изображения, строки и т. д.).