Каковы основные аргументы, которые должно иметь каждое хорошее приложение CLI?

Как отмечено в правилах управления памятью , всякий раз, когда у вас есть объект, который вы создали с помощью +alloc, +new, -copy или -mutableCopy, вы владеете им и несете ответственность за него. для выпуска его в какой-то момент. (На самом деле, +new - это просто сокращение для [[MyClass alloc] init].) Как вы заметили, создание массива через [NSArray new] без его освобождения - утечка памяти). Однако, если вы правильно обрабатываете этот объект, в какой-то момент его можно отпустить. Например:

  • Если метод, который использует , массив вызывается из в метод, который создает массив, то вы должны иметь возможность освободить массив после того, как он был использован. Если внутреннему методу необходимо сохранить более постоянную ссылку на массив, то этот метод отвечает за отправку -retain и, в конечном итоге, -release объекту. Например:

    - (void)myMethod {
        NSArray *removals = [NSArray new];
        // ...
        [someObject someOtherMethod:removals];
        [removals release];
    }
    
  • Если вы создали массив в методе -init для объекта, то метод -dealloc ] может освободить его, когда объект уничтожен.

  • Если вам нужно создать массив, а затем вернуть его из метода, вы обнаружили причину, по которой было изобретено автоматическое освобождение. Вызывающий ваш метод не несет ответственности за освобождение объекта, так как это не метод +alloc, +new, -copy или -mutableCopy, но вы должны убедиться, что он в конце концов освобожден. В этом случае вы вручную вызываете -autorelease для объекта, прежде чем вернуть его. Например:

    - (NSArray *)myMethod {
        NSArray *removals = [NSArray new];
        // ...
        return [removals autorelease];
    }
    

Когда вы создаете массив с помощью +arrayWithCapacity:, вы не вызываете один из «специальных» методов, поэтому вам не нужно освобождать результат , Это, вероятно, реализовано в -autorelease, очень похоже на последний пример выше, но не обязательно. (Между прочим, вы также можете создать пустой автоматически выпущенный NSMutableArray с помощью [NSMutableArray array]; метод находится в NSArray, поэтому он не будет отображаться в документации по NSMutableArray, но он создаст изменяемый массив при отправке в класс NSMutableArray. ) Если вы собираетесь возвращать массив из вашего метода, вы можете использовать его как сокращение для [[[NSMutableArray alloc] init] autorelease], но это всего лишь ярлык. Однако во многих ситуациях вы можете создать объект с помощью -init или +new и вручную отпустить его в соответствующее время.

10
задан UnkwnTech 13 June 2009 в 08:54
поделиться

7 ответов

Стандарты кодирования GNU предписывают - версия и - помогают , и я ожидал, что любая программа CLI будет их поддерживать. Помимо этого, это действительно зависит от того, что это за программа, но вот еще несколько предложений: -q или - quiet для меньшего вывода, -v или - подробный для получения дополнительных результатов, -d или - debug для вывода отладки.

11
ответ дан 3 December 2019 в 14:35
поделиться

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

3
ответ дан 3 December 2019 в 14:35
поделиться

Это зависит от платформы.

В Windows /? или / h или / help являются общими.

В Unix команда должна иметь страницу руководства.

В вариантах Unix, в которых соблюдаются соглашения Gnu (например, Linux), она должна отвечать на --help и - версия. Более того, он может интегрироваться с автозаполнением bash.

Кроме того, посмотрите на другие программы в той же области, что и ваша, и используйте те же параметры, где это имеет смысл. Например:

  • -r / - рекурсивный для рекурсии вниз по каталогам
  • -q / - quiet для подавления вывода
  • -v / - verbose для генерации подробного диагностического вывода
  • -n для выполнения без изменение чего-либо

Если ваша программа принимает имена файлов в качестве аргументов, то по общему соглашению один дефис означает "чтение из стандартного ввода", а двойной дефис означает " рассматривать следующий аргумент как файл, даже если он начинается с дефиса '.

8
ответ дан 3 December 2019 в 14:35
поделиться

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

2
ответ дан 3 December 2019 в 14:35
поделиться

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

--config-file=FILE | -C FILE
--help | -h
--usage | -u
--version | -v

Включите другие соответствующие параметры для вашего приложения.

5
ответ дан 3 December 2019 в 14:35
поделиться

-h обязательно на * nix. Я бы сказал то же самое для /? в Windows, но программы, доступные для обеих платформ, обычно используют стиль * nix. Вероятно, это из-за getopt и его друзей.

Некоторые важные вещи:

-h, --help
-v, --version
-u, --usage

Если приложение вообще изменяет какие-либо файлы:

--dry-run    Do not modify any files (but work as if you did)

Если приложение использует файлы конфигурации, варианты использования указанного файла конфигурации или каталога.

Некоторые основные рабочие переключатели для работы в неинтерактивном режиме и выполнения задания:

mysql --execute="SELECT * FROM ..."
cmd.exe /C "dir"
2
ответ дан 3 December 2019 в 14:35
поделиться

Эрик С. Раймонд дает отличный обзор наиболее распространенных параметров командной строки UNIX в своей замечательной книге Искусство программирования Unix . В основном он говорит об однобуквенных вариантах, но тем не менее является отличным ресурсом по этому вопросу.

2
ответ дан 3 December 2019 в 14:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: