iPhone и iPad – включение класса увеличит двоичный код?

StackOverflow https://stackoverflow.com/questions/2342871

  •  23-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Из Документы Apple:

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

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

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

Другие советы

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

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

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

Похоже, вам нужно провести рефакторинг и переименовать класс большой толстой мамы.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top