Управление памятью какао NSArray с объектами - PullRequest
0 голосов
/ 09 марта 2010

У меня проблемы с освобождением объектов. Чтобы объяснить это лучше, я включил свой код ниже.

NSTask *task = [NSTask new];
NSTask *grep = [NSTask new]; 
NSPipe *pipe = [NSPipe new];

[task setStandardError: pipe];
[grep setStandardInput: pipe];
[pipe release];
pipe = [NSPipe new];
[grep setStandardOutput: pipe];

[task launch];
[grep launch];

NSString *string = [[[[[[NSString alloc] initWithData: [[[grep standardOutput] fileHandleForReading] readDataToEndOfFile] encoding: NSASCIIStringEncoding] autorelease] componentsSeparatedByString: @" "] objectAtIndex: 3] substringToIndex: 8];

NSMutableDictionary *dict = [NSMutableDictionary new];
[dict setObject: string forKey: @"myKey"];
[records addObject: dict];
[dict release];

[task release];
[grep release];
[pipe release];

Как бы я освободил строку и есть ли другие утечки? Кроме того, если я удаляю все из массива records с помощью removeAllObjects, все ли освобождается нормально? Массив никогда не должен выпускаться и быть доступным постоянно, я просто беспокоюсь о его объектах.

Редактировать: Единственная указанная утечка была связана с NSPipe и должна быть исправлена ​​в коде.

Спасибо за любую помощь!

Ответы [ 2 ]

4 голосов
/ 09 марта 2010

Управление памятью в Objective-C имеет одно фундаментальное правило :

Вы становитесь владельцем объекта, если создаете его с помощью метода, имя которого начинается с «alloc» или «new» или содержит «copy» (например, alloc, newObject или mutableCopy), или если вы отправляете ему сохранить сообщение. Вы несете ответственность за отказ от владения принадлежащими вам объектами с помощью выпуска или автоматического выпуска. В любое другое время, когда вы получаете объект, вы не должны отпускать его.

Таким образом, каждый вызов new в вашем примере кода должен быть сбалансирован с вызовом release или autorelease. NSArray, наряду с большинством других объектов в коде, тоже не создается, поэтому его не нужно выпускать. [NSString alloc] автоматически выпущен, поэтому о нем позаботятся. Коллекции управляют своими собственными элементами, сохраняя и освобождая их по мере необходимости: когда элемент вставлен, он сохраняется; когда это удалено, это выпущено. Ключи словаря копируются, а не сохраняются.

Если у вас есть несбалансированный new (и, следовательно, утечка), это первый NSPipe, который вы создали. Отпустите его перед созданием канала для стандартного вывода grep. Возможно, вы просто пропустили этот пример, но вы также не задаете никаких аргументов для задачи grep.

1 голос
/ 09 марта 2010

substringToIndex: возвращает автоматически выпущенную строку, поэтому нет необходимости release ее.

Единственная утечка памяти, которую я вижу, это когда вы настраиваете свой 'pipe' var во второй раз (для стандартного вывода задачи), не выпуская сначала его текущее значение (экземпляр NSPipe, используемый для стандартной ошибки и ввода).

Изменяемые коллекции, такие как NSMutableArray, сохранят содержащиеся в них объекты (как и все изменяемые / неизменяемые коллекции), а затем освобождают их при удалении (или когда сама коллекция освобождается).

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