Будет ли этот Objective-C, вложенный NSArray вызвать утечку памяти на iPhone? - PullRequest
2 голосов
/ 26 сентября 2010
NSArray *tLines = [[NSArray alloc] initWithObjects:
                   [[NSArray alloc] initWithObjects:@"Matt", @"David", nil],
                   [[NSArray alloc] initWithObjects:@"Bob", @"Ken", nil], nil];
self.lines = tLines;
[tLines release];

Я alloc в NSArray с в пределах NSArray, будут ли освобождены вложенные массивы при вызове [lines release];?

Ответы [ 4 ]

3 голосов
/ 26 сентября 2010

Почему вы не используете удобный метод?Нет необходимости освобождать память.

NSArray *tLines = [NSArray arrayWithObjects:
                   [NSArray arrayWithObjects:@"Matt", @"David", nil],
                   [NSArray arrayWithObjects:@"Bob", @"Ken", nil], nil];
2 голосов
/ 26 сентября 2010

Да, это приведет к утечке.

При создании вложенные массивы имеют счет сохранения 2 (от alloc и добавление в массив). Когда tLines выпущено, это уменьшается до 1; чего недостаточно, чтобы его освободили; это означает, что они протекают.

Используйте +[NSArray arrayWithObjects] или автоматически высвобождайте массивы при создании.

Помните: NARC (New, Alloc, Retain, Copy) всегда должен быть сбалансирован с выпуском или авто-выпуском.

1 голос
/ 26 сентября 2010

Нет, вы не должны этого делать. Когда вы alloc массивы, вы должны освободить их. Содержащий массив будет обрабатывать управление памятью для своих объектов (сохраняя их при их добавлении, освобождая при их удалении), но ответственность за их освобождение лежит на ответственности созданного объекта над массивами. Вам следует либо использовать вспомогательный конструктор для создания массивов, либо создавать их по одному и освобождать после добавления в основной массив.

1 голос
/ 26 сентября 2010

Я почти уверен, что он протечет, если только вы сами не отпустите каждый объект перед очисткой массива ...

Или попробуйте использовать опцию autorelease при создании, она будет работать за вас ...

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