Память не освобождается, хотя я ее освобождаю - PullRequest
0 голосов
/ 26 февраля 2012

Я занимаюсь оптимизацией своего приложения и проверяю, правильно ли реализовано управление памятью.Поскольку я обнаружил, что didUnload / dealloc / willAppear не надежен для реализации очистки моей памяти, я решил реализовать свой собственный метод, чтобы иметь полный контроль над управлением памятью.

Определение моих массивов в заголовочном файле

@property (retain) NSMutableArray *selectedCardIDs;
@property (retain) NSMutableArray *selectedRowArray;
@property (retain) NSMutableArray *cardArray;
@property (retain) NSMutableArray *cardIDArray;

Здесь метод выпуска:

- (void) willReleaseObjects {
[self.aCopyOfCardIDArray release];
[self.listOfItems release];
[self.aCopyListOfItems release];
[self.selectedCardIDs release];
[self.selectedRowArray release];
[self.cardArray release];
[self.cardIDArray release];

}

Массивы могут стать очень большими(> 1 000 записей каждый), почему освобождение этих массивов важно после выгрузки представления.Я явно вызываю эту функцию в методе IBAction, например:

- (IBAction) stopDictionary:(UIBarButtonItem *) sender {
[self closeDatabase];
[self willReleaseObjects];
[self dismissModalViewControllerAnimated:YES];

}

Я отладил код, и он фактически выполняет каждый выпуск, однако при диагностике выделения памяти с помощью инструментовКажется, это освобождает только частичную память, фактически почти ничего, поэтому потребление памяти, конечно, увеличивается с каждым разом, когда я снова загружаю это представление, что совсем не хорошо.Любая идея, почему моя память не освобождается здесь?Спасибо.

1 Ответ

1 голос
/ 26 февраля 2012

Не вызывайте release для свойства, так как вы рискуете что-то очень плохое, если у вас есть какие-либо свойства, объявленные как назначить или скопировать.Вы можете потенциально освободить возвращенный экземпляр, который уже автоматически выпущен.

Вместо этого либо освободите переменную экземпляра позади него, либо установите для свойства значение nil.В любом случае вы достигнете правильного результата.Если у вас есть какие-либо наблюдатели Key / Value в ваших свойствах, лучший способ - установить для свойств значение nil, которое автоматически распространит значения для любых наблюдателей:

- (void) willReleaseObjects {
  self.aCopyOfCardIDArray = nil;
  self.listOfItems = nil;
  ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...