Утечка памяти при выделении и освобождении NSArray - PullRequest
0 голосов
/ 25 марта 2011

Я получаю сообщение об утечке памяти от Instruments по следующему коду:

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

fieldLabels - это iVar, объявленный как:

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

Instruments сообщает следующее:

#   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];

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

1 Ответ

0 голосов
/ 25 марта 2011

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

  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 для массива, который вам нужен.
...