цель c утечкой памяти с массивом? - PullRequest
1 голос
/ 31 мая 2011

В моем приложении я объявляю свойство массива

@property (nonatomic, retain) NSArray *listOfItems;

, а в моем методе viewDidLoad

listOfItems = [[NSArray alloc] initWithObjects:@"First", @"Second", nil];

Я не освобождаю массив в моем viewDidLoad, потому что объекты вмассив потребуется в другом месте приложения.
Наконец, в моем методе dealloc я поставил

[listOfItems release];

Мой вопрос: есть ли утечка памяти в этом коде?Число сохранений должно быть увеличено в два раза из-за (сохранения) в свойстве, а также для alloc в viewDidLoad, но только один раз в методе dealloc.

Ответы [ 6 ]

1 голос
/ 31 мая 2011

удержание будет «срабатывать» только тогда, когда вы делаете это следующим образом

self.listOfItems = [[NSArray alloc] initWithObjects:...];

Так вот, количество удержаний действительно равно 2. Если вы оставите себя вне себя, оно будет просто одним. Существует явная разница в вызове 'set' и просто присвоении.

ответить на ваш оригинальный вопрос; ваш код не пропускает.

0 голосов
/ 02 июня 2011

Это не будет сбивать с толку, если вы практикуете, как это

@property (nonatomic, retain) NSArray *listOfItems;  
NSArray *temparray = [[NSArray alloc] initWithObjects:@"First", @"Second", nil];  
self.listOfItems = temparray;  
[temparray release];

и в dealloc

[listOfItems release];
0 голосов
/ 31 мая 2011

Да, есть потенциальная утечка.Обратите внимание:

  1. В -viewDidLoad вы настраиваете listOfItems, как вы описали.
  2. Впоследствии некоторые другие коды вызывают yourObject.listOfItems = someNewList;.
  3. Ваш -deallocРелизы listOfItems.

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

  • Ваш ivar listOfItems неожиданно указывает на другой список.
  • У вас больше нет ссылки на старый список, поэтомуэто никогда не может быть выпущено.Это ваша утечка.

Гораздо лучше освободить массив в -viewDidLoad после того, как вы присвоили его свойству.

0 голосов
/ 31 мая 2011

Точно так же, как сказал @MiRAGe,

listOfItems = [[NSArray alloc] initWithObjects:@"First", @"Second", nil];

Счет удержания будет 1

, но если код

self.listOfItems = [[NSArray alloc] initWithObjects:@"First", @"Second", nil];

Счет удержания будет 2

0 голосов
/ 31 мая 2011
NSArray *array=[[NSArray alloc] initWithObjects:@"First",@"Second",nil];
self.listOfItems=array;
[array release];

Вы также можете использовать этот способ.

0 голосов
/ 31 мая 2011

Поскольку ваш установщик сохраняет массив, вы должны освободить его, после того как вы разместили и установили его в своем методе viewDidLoad (с этой нотацией я предлагаю "autorelease").

Но, возможно, вам будет легче, есливы используете [NSArray arrayWitObjects:].

...