правильная обработка памяти для NSMutableArray, назначенного свойству? - PullRequest
0 голосов
/ 22 декабря 2011

У меня есть свойство, объявленное так:

@property (nonatomic, retain) NSMutableArray *pricingLevels;

И я присваиваю его так:

 self.pricingLevels = [[[NSMutableArray alloc] init];

в моем dealloc У меня есть это:

self.pricinglevels=nil;

Когда я анализирую свой код с помощью xCode, он говорит, что у меня здесь утечка памяти:

self.pricingLevels = [[[NSMutableArray alloc] init];

Должен ли я использовать autolrelease для этого, потому что self.pricinglevels также содержит ссылку на массив?

Ответы [ 3 ]

2 голосов
/ 22 декабря 2011

self.pricingLevels - это свойство, объявленное как retained, что означает, что каждый раз, когда вы устанавливаете его посредством присваивания свойства (синтаксис точки или метод), объект автоматически сохраняет объект для вас.

self.pricingLevels = [NSMutableArray array];
[self setPricingLevels:[NSMutableArray array]];

Приведенный выше код сделает то же самое и автоматически сохранит переданный массив.Это то, что происходит под капотом (или что-то подобное).Этот метод вызывается:

- (void)setPricingLevels:(NSMutableArray *)a {
    if(_pricingLevels != a) {
        [_pricingLevels release];
        _pricingLevels = [a retain];
    }
}

Видите?Сохраняется автоматически, а предыдущее значение автоматически освобождается.

РЕДАКТИРОВАТЬ , чтобы ответить на ваш последний вопрос : Да, вам следует позвонить autorelease

0 голосов
/ 22 декабря 2011

Проблема заключается в том, что при инициализации и освобождении вы не должны использовать self перед переменной

self.pricingLevels = [[[NSMutableArray alloc] init];
//instead it should be

pricingLevels = [[[NSMutableArray alloc] init];

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

[pricingLevels release];
pricingLevels = nil;
0 голосов
/ 22 декабря 2011

Да, у вас утечка памяти.Присвоение self.propertyName для сохраненного свойства автоматически выполняет сохранение.Вам либо нужно освободить объект после назначения (чуть более эффективно просто сделать release после назначения против использования autorelease), либо вам нужно назначить сохраненный объект полю экземпляра (sans self.), а не имени свойства, И, для этого последнего случая вы должны быть уверены, что поле экземпляра было ранее ноль (т. Е. Только прямое присваивание в логике инициализации).

(И не забывайте свой метод dealloc.)

(Все это не имеет ничего общего с тем фактом, что объект оказывается NSMutableArray.)

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