Как отмечено в правилах управления памятью , всякий раз, когда у вас есть объект, который вы создали с помощью +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
и вручную отпустить его в соответствующее время.
Стандарты кодирования GNU предписывают - версия
и - помогают
, и я ожидал, что любая программа CLI будет их поддерживать. Помимо этого, это действительно зависит от того, что это за программа, но вот еще несколько предложений: -q
или - quiet
для меньшего вывода, -v
или - подробный
для получения дополнительных результатов, -d
или - debug
для вывода отладки.
Я согласен со всеми аргументами, упомянутыми выше, но хотел бы указать еще на одну вещь: вы можете захотеть, чтобы ваше приложение принимало длинные, короткие и стиль BSD для всех аргументов. Конечно, стиль BSD можно опустить, если вы чувствуете, что никому из ваших пользователей не будет комфортно его использовать. Длинный стиль помогает придать аргументам смысл и облегчает их запоминание при начале работы с приложением.
Это зависит от платформы.
В Windows /? или / h или / help являются общими.
В Unix команда должна иметь страницу руководства.
В вариантах Unix, в которых соблюдаются соглашения Gnu (например, Linux), она должна отвечать на --help и - версия. Более того, он может интегрироваться с автозаполнением bash.
Кроме того, посмотрите на другие программы в той же области, что и ваша, и используйте те же параметры, где это имеет смысл. Например:
Если ваша программа принимает имена файлов в качестве аргументов, то по общему соглашению один дефис означает "чтение из стандартного ввода", а двойной дефис означает " рассматривать следующий аргумент как файл, даже если он начинается с дефиса '.
Я бы предложил возможность справки, версия, настройки детализации вывода. Остальные переключатели зависят от вашего приложения.
Краткая и длинная версии аргументов командной строки. Проверьте, существует ли порт библиотеки getopt
для используемого вами языка программирования. Это поможет вам в синтаксическом анализе аргументов командной строки.
--config-file=FILE | -C FILE
--help | -h
--usage | -u
--version | -v
Включите другие соответствующие параметры для вашего приложения.
-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"
Эрик С. Раймонд дает отличный обзор наиболее распространенных параметров командной строки UNIX в своей замечательной книге Искусство программирования Unix . В основном он говорит об однобуквенных вариантах, но тем не менее является отличным ресурсом по этому вопросу.