iPhone - Сохранить счет - Сохранить счет идет без видимой причины - PullRequest
0 голосов
/ 28 августа 2010

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

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

Теперь я впервые заметил проблему, когда не вызывается функция dealloc NormalGameClass, поэтому я сделал несколько вызовов retainCount и по какой-то причине, когда она возвращается к функции release в 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 ... дважды. = / Раскрась меня в замешательстве.

Ответы [ 2 ]

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

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 голосов
/ 28 августа 2010

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

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

Кроме того, старайтесь не проверять сохраняемые данные, поскольку это приведет только к путанице и головным болям.Просто следуйте правилам управления памятью .

...