2011-03-25 2 views
0

Я получаю сообщили утечку памяти из инструментов на следующий код:утечка памяти при выделении и выпуская NSArray

NSArray *array = [[NSArray alloc] initWithObjects:@"Amount (oz):", @"Amount (ml):", @"Supplement:", nil]; 
self.fieldLabels = array; 
[array release]; 

fieldLabels является Ивар, заявленный как:

NSArray *fieldLabels; 
@property (nonatomic, retain) NSArray *fieldLabels; 

отчеты инструменты следующее:

# Category Event Type Timestamp RefCt Address Size Responsible Library Responsible Caller 
0 __NSArrayI Malloc 00:16.513.592 1 0x660bb40 32 InfantCare -[Supplemental_Amount viewDidLoad] 
1 __NSArrayI Retain 00:16.513.595 2 0x660bb40 0 InfantCare -[Supplemental_Amount setFieldLabels:] 
2 __NSArrayI Release 00:16.513.595 1 0x660bb40 0 InfantCare -[Supplemental_Amount viewDidLoad] 

затем я изменил код так, вместо:

self.fieldLabels = array; 

я поставил:

[self setFieldLabels:array]; 

Нет больше утечек (предположительно!). Почему это должно быть? Спасибо!

ответ

0

Оба синтаксиса идентичны. Учитывая тот факт, что вы объявили свое свойство fieldLabels с атрибутом сохранения, счетчик ссылок вашего массива после вашего вызова setFieldLabels (который вызывается при написании: self.fieldLabels = array) - это то, что вы ожидаете. Действительно, учитывая последовательность вызовов в коде происходит следующее:

  1. NSArray *array = [[NSArray alloc] initWithObjects:@"Amount (oz):", @"Amount (ml):", @"Supplement:", nil]; Это устанавливает RefCount памяти, выделенной на 1
  2. self.fieldLabels = array; Сохранит массив, выпуск независимо от ранее удерживаемой fieldLabels и назначить fieldLabels к сохраненному массиву. На этом этапе количество удержаний массива равно 2 (1 из init, 1 из присвоения свойства).
  3. [array release]; Возвращает счетчик возврата в 1 для массива, который вы хотите.
+0

Это то, что я думал ... однако, почему инструменты сообщают об этом как утечку памяти? – DNewell

+0

Возможно, утечка произойдет позже, когда объект, содержащий поле fieldLabels, будет выгружен. Вы выпускаете 'fieldLabels' везде, где должны? – MiKL

Смежные вопросы