2010-08-27 2 views
0

Быстрый вопрос, надеюсь, я просто пропустил что-то простое. Хорошо, у меня есть один класс, который содержит указатель на другой; MainMenuClass и NormalGameClass. Внутри MainMenuClass я делаю следующее.iPhone - Сохранение счета - Сохранение счета идет без видимой причины

m_NormalGame = [[NormalGameMode alloc] initWithNibName:@"NormalGameMode" bundle:[NSBundle mainBundle]]; 
m_NormalGame.delegate = self; 
[self presentModalViewController:m_NormalGame animated:YES]; 

Теперь я первый заметил проблему, когда функция dealloc в NormalGameClass' не будучи под названием, так что я сделал некоторые retainCount звонки и по какой-то причине, когда он делает свой путь обратно к функции выхода в MainMenu, ее сохранить кол 6. Дальше копать меня очень смущает. Первая строка после viewDidLoad в NormalGameClass равна [self retainCount] 4. У кого-нибудь есть представление о том, что здесь происходит? Я только вызываю alloc на NormalGameClass один раз, и все же он сохраняется до 6? Как ни странно, этого никогда не было. Спасибо за понимание.

ОБНОВЛЕНИЕ: Играли с вещами и находили это неудобным. В MainMenuClass, вот как я избавлюсь от NormalGame.

[self dismissModalViewControllerAnimated:NO]; 
m_NormalGame.delegate = nil; 
[m_NormalGame release]; 

Теперь, с этой установкой, dealloc для NormalGame никогда не вызывается. Однако, если я вызываю [m_NormalGame release] сразу после вышеописанного, он вызывает dealloc для NormalGame ... дважды. =/Нарисуйте меня в замешательстве.

+0

Это ваши собственные классы или они происходят из других библиотек? – 2010-08-27 21:04:57

+0

Это UIViewControllers, просто переименованные. – Midnight

ответ

0

presentModalViewController сохраняет переданный контроллер представления, поэтому вам нужно освободить контроллер представления, переданный, если вы его не авторизуете. В этом случае вам нужно будет освободить m_NormalGame.

m_NormalGame = [[NormalGameMode alloc] initWithNibName:@"NormalGameMode" bundle:[NSBundle mainBundle]]; 
m_NormalGame.delegate = self; 
[self presentModalViewController:m_NormalGame animated:YES]; 
**[m_NormalGame release];** 
+0

Ух! Огромное спасибо. Ты спасатель. – Midnight

+0

Без проблем, рад, что я мог бы помочь! – bstahlhood

0

Я бы предположил, что вызов -dismissModalViewControllerAnimated: вызов не освобождает контроллер вида до завершения увольнения. Вам необходимо сбалансировать исходный -alloc/-init контроллера с -release, но вы не должны ожидать немедленного вызова метода -dealloc. На самом деле его можно вызвать во время следующей итерации цикла запуска, если объект был автореализован.

Вы говорите, что без два вызова для освобождения вашего dealloc не вызваны или его просто не вызывают немедленно?

Также старайтесь не проверять количество удержаний, так как это приведет только к путанице и головным болям. Просто следуйте за memory management rules должным образом.

+0

Я поставил точку останова в методе dealloc NormalGame. Имея только один звонок, эта точка останова никогда не срабатывает. Поэтому dealloc по существу никогда не называется. – Midnight

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