Проблемы с освобождением памяти при подключении viewController с помощью navigationController - PullRequest
0 голосов
/ 17 августа 2010

У меня следующая проблема. Когда я выдвигаю контроллер представления, нажимая кнопку «назад», метод dealloc не вызывается.

Вот код, который я использую:

NSLog(@"coleccionVista retain count0: %i",[coleccionVista retainCount]);

coleccionVista = [[coleccionViewController alloc] init];
NSString *nombreColeccion = [colecciones objectAtIndex:i];
coleccionVista.nombreColeccion = nombreColeccion;
coleccionVista.title = [NSString stringWithFormat:coleccionVista.nombreColeccion];
NSLog(@"coleccionVista retain count1: %i",[coleccionVista retainCount]);

[self.navigationController pushViewController:coleccionVista animated:NO];
NSLog(@"coleccionVista retain count2: %i",[coleccionVista retainCount]);

[coleccionVista release];
//[coleccionVista release];
NSLog(@"coleccionVista retain count3: %i",[coleccionVista retainCount]);

И я получаю эти сообщения на консоли:

Первый раз, когда я нажимаю на вид:

2010-08-17 10:30:36.019 TAU 4[50133:207] coleccionVista retain count0: 0
2010-08-17 10:30:36.021 TAU 4[50133:207] coleccionVista retain count1: 1
2010-08-17 10:30:36.022 TAU 4[50133:207] coleccionVista retain count2: 3
2010-08-17 10:30:36.022 TAU 4[50133:207] coleccionVista retain count3: 2
2010-08-17 10:30:36.088 TAU 4[50133:207] coleccionViewController->viewWillAppear
2010-08-17 10:30:38.515 TAU 4[50133:207] coleccionViewController->viewWillDisappear

Второй раз:

2010-08-17 10:30:44.171 TAU 4[50133:207] coleccionVista retain count0: 1
2010-08-17 10:30:44.173 TAU 4[50133:207] coleccionVista retain count1: 1
2010-08-17 10:30:44.174 TAU 4[50133:207] coleccionVista retain count2: 3
2010-08-17 10:30:44.176 TAU 4[50133:207] coleccionVista retain count3: 2
2010-08-17 10:30:44.241 TAU 4[50133:207] coleccionViewController->viewWillAppear
2010-08-17 10:30:52.332 TAU 4[50133:207] coleccionViewController->viewWillDisappear

У меня также есть сообщение NSLog о методе dealloc, который не отображается. Но я заметил, что если я заставлю другой [выпуск coleccionVista] после другого, появится сообщение dealloc, но сбой при попытке [super dealloc]. Я не держу никаких других ссылок на coleccionViewController (я искал в коде, и все применения метода в коде, который я вам показываю).

Есть идеи? Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 19 августа 2010

Две большие проблемы:

NSLog(@"coleccionVista retain count0: %i",[coleccionVista retainCount]);
coleccionVista = [[coleccionViewController alloc] init];

Предположительно coleccionVista может быть не ноль, но вы не выпускаете его, прежде чем начинать новую.Это либо утечка, либо авария.Также обратите внимание, что -retainCount возвращает NSUInteger, а не int;форматирование его с помощью% i вызывает неопределенное поведение (обычно это просто печать неправильного числа в 64-разрядных системах с прямым порядком байтов).

[coleccionVista release];
NSLog(@"coleccionVista retain count3: %i",[coleccionVista retainCount]);

Вы что-то выпускаете.Вы больше не владеете им.Его использование небезопасно, если вы не знаете , что это принадлежит кому-то другому.Возможно, вы захотите либо [coleccionVista release]; coleccionVista = nil;, либо просто self.coleccionVista = nil, если вы сделали его свойством.

0 голосов
/ 19 августа 2010

В конце концов, я думаю, что понял, что случилось. Я изменил много кода, поэтому я не уверен в этом, но кажется, что это был NSTimer, который использовал метод класса coleccionVista, поэтому он поддерживал ссылку на класс, поэтому было невозможно освободить его.

...