Как обнаружить неиспользуемые методы и #import в Objective-C

После долгого времени работы с iPhone-приложением я понял, что мой код довольно грязный, содержащий несколько #import и методы, которые не называются или вообще полезны.

Я хотел бы знать, есть ли какая-либо директива компилятора или способ обнаружить эти бесполезные строки кода. Есть ли у Xcode какой-либо инструмент для обнаружения этого?

Ответ 1

Xcode позволяет (un) проверять настройки для определенных предупреждений компилятора, которые могут предупредить вас о некоторых типах неиспользуемого кода. (Выберите проект в списке источников и "Файл" > "Получить информацию", затем выберите вкладку "Построение" ). Вот несколько (которые отображаются для Clang и GCC 4.2 для меня), которые могут представлять интерес:

  • Неиспользуемые функции
  • Неиспользуемые параметры
  • Неиспользуемые значения

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

Неиспользуемые методы Objective-C гораздо труднее обнаружить, чем неиспользуемые функции C, потому что сообщения отправляются динамически. Предупреждение или ошибка могут сообщить вам, что у вас есть потенциальная проблема, но отсутствие одного не гарантирует, что вы не будете иметь ошибки времени выполнения.


Изменить: Другим хорошим способом обнаружения (потенциально) неиспользуемых методов является проверка охвата кода из фактических исполнений. Обычно это делается в тандеме с автоматическим модульным тестированием, но не обязательно.

Это сообщение в блоге - достойное введение в модульное тестирование и покрытие кода с использованием Xcode. Раздел gcov (который работает только с кодом, созданным GCC, кстати) объясняет, как получить Xcode для создания инструментального кода, который может записывать, как часто он был выполнен. Если вы возьмете инструментальную сборку своего приложения для вращения в симуляторе, запустите gcov на нем, вы увидите, какой код был выполнен с помощью инструмента, такого как CoverStory (довольно упрощенный GUI) или lcov (Perl-скрипты для создания отчетов HTML).

Я использую gcov и lcov для CHDataStructures.framework и автоматически генерирует отчеты о покрытии после каждого связывания SVN. Опять же, помните, что неразумно рассматривать выполненное покрытие как окончательную меру того, какой код "мертв", но он, безусловно, может помочь определить методы, которые вы можете исследовать дальше.

Наконец, поскольку вы пытаетесь удалить мертвый код, я думаю, вы также найдете этот СОСТОЙНЫЙ вопрос:

Ответ 2

Appcode имеет функцию проверки кода, которая находит неиспользуемые импорт и код.

Ответ 3

Мы использовали некоторый домашний код Ruby, который теперь извлекается в драгоценный камень под названием fui: https://github.com/dblock/fui

Ответ 4

Недавно я написал script, чтобы найти неиспользуемые (или повторяющиеся) операторы #import: https://gist.github.com/Orangenhain/7691314

script принимает файл ObjC.m и начинает комментировать каждую строку #import по очереди и видит, если проект все еще компилируется. Вам нужно будет изменить BUILD_DIR и BUILD_CMD.

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

Я написал это, не зная, что AppCode имеет аналогичную функцию, однако, когда я тестировал AppCode, он был не таким полным, как этот script (но быстрее (для всего проекта)).

Ответ 6

Вы можете использовать Xcode Analyzer, чтобы найти это и другие проблемы.

http://help.apple.com/xcode/mac/8.0/#/devb7babe820

Также вы можете перейти к проекту и настроить цель и добавить настройки предупреждений о изменениях в настройках сборки. См. Это руководство:

http://oleb.net/blog/2013/04/compiler-warnings-for-objective-c-developers/

Ответ 7

Недавно я изменил большой проект от Carbon до Cocoa. В конце этого было немало сиротских файлов, которые больше не использовались. Я написал script, чтобы найти их, которые по существу сделали это:

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

После выполнения этого, верните, а затем удалите все опустошенные файлы, скомпилируйте и удалите все ошибки #imports.

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

Такую же технику можно использовать, чтобы увидеть, какие #imports могут быть удалены - вместо того, чтобы обрезать файл, удалите каждый #import в файле по очереди и посмотрите, не сработает ли сборка.