Управление памятью в Objective-C имеет одно фундаментальное правило :
Вы становитесь владельцем объекта, если создаете его с помощью метода, имя которого начинается с «alloc» или «new» или содержит «copy» (например, alloc, newObject или mutableCopy), или если вы отправляете ему сохранить сообщение. Вы несете ответственность за отказ от владения принадлежащими вам объектами с помощью выпуска или автоматического выпуска. В любое другое время, когда вы получаете объект, вы не должны отпускать его.
Таким образом, каждый вызов new
в вашем примере кода должен быть сбалансирован с вызовом release
или autorelease
. NSArray
, наряду с большинством других объектов в коде, тоже не создается, поэтому его не нужно выпускать. [NSString alloc]
автоматически выпущен, поэтому о нем позаботятся. Коллекции управляют своими собственными элементами, сохраняя и освобождая их по мере необходимости: когда элемент вставлен, он сохраняется; когда это удалено, это выпущено. Ключи словаря копируются, а не сохраняются.
Если у вас есть несбалансированный new
(и, следовательно, утечка), это первый NSPipe
, который вы создали. Отпустите его перед созданием канала для стандартного вывода grep. Возможно, вы просто пропустили этот пример, но вы также не задаете никаких аргументов для задачи grep.