Подтвердить что ты не робот

Объект, вероятно, был изменен после освобождения

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

iGreenAppDelegate *delegate = [UIApplication sharedApplication].delegate;
if(checkInViewController) {
    [checkInViewController release];
    checkInViewController = nil;
}
checkInViewController = [[CheckInViewController alloc] initWithCheckpoint:checkpoint];

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.8];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:[delegate window] cache:YES];
[[delegate rootTabBarController].view removeFromSuperview];
[[delegate window] addSubview:checkInViewController.view];
[UIView commitAnimations];

Проблема во второй раз, когда я запускаю UIViewController, я хочу ее освободить, чтобы избежать утечки памяти. Отладчик отображает

iGreen (916,0x3f60348c) malloc: ошибка для объекта 0x130350: некорректная контрольная сумма для освобожденного объекта - объект, вероятно, был изменен после освобождения.  установить точку останова в malloc_error_break для отладки

Это странно, потому что аналогичные коды в других частях не возвращают такую ​​ошибку. Кроме того, я попробовал авторекламу, но программа немедленно сработает, и отладчик говорит, что я модифицирую финализированные слои.

Я работаю над проблемой всю ночь и все еще смущаюсь.

4b9b3361

Ответ 1

Установите точку останова в malloc_error_break для отладки.

Сделайте это и опубликуйте обратную трассировку.

Обычно это означает, что вы испорчены памятью, но это также может означать, что у вас есть слишком выпущенный объект. Попробуйте также "Сборка и анализ".

Ответ 2

Помимо установки точки останова в malloc_error_break - нажмите Command-6 в xCode, чтобы перейти на вкладку точек останова, также включите средства malloc в вашей схеме.

Перейдите в селектор схем, выберите "Изменить схему", найдите цель "Запустить" и перейдите на вкладку "Диагностика". Ниже управления памятью позволяют писать, защищать края, защищать объекты malloc и zombie.

С небольшим успехом xCode поймает вас на запись за пределами выделенной памяти и повреждение памяти.

Это, как взрослый надзор за работой с памятью...

Ответ 3

Понять сообщение об ошибке: он говорит, что что-то продолжало использовать (и изменять) объект после его освобождения. Этот код освобождает его и не изменяет его после этого, но вы должны спросить, что еще можно продолжить использовать (не зная, что он уже освобожден).

Каждый раз, когда выполняется код в этом фрагменте, он освобождает (освобождает) любой существующий checkinViewController и выделяет новый, и, очевидно, он никогда не касается старого. Но кто еще может иметь указатель на старый объект?

Возможно, другой код, который вы написали, и, возможно, [делегировать окно], который получает ссылку через "[[делегировать окно] addSubview: checkInViewController.view];"? Надеюсь, последний берет свою собственную ссылку, то есть релиз не сразу освободит ее.

Но следите за тем, где вы копируете этот указатель, не добавляя ссылку. Если вы делаете это где-то, а затем в другом месте (например, вышеприведенный фрагмент), кто-то вызывает выпуск на том же указателе, теперь у вас может быть указатель на освобожденный объект.

Ответ 4

В вашем коде есть несколько вещей, которые не соответствуют дизайну. Сначала вы освободите checkInViewController, не удаляя его вид из своего супервизора (если есть), затем вы удаляете представление rootTabBarController из своего супервизора, не делая ничего с самим контроллером, и вы не добавляете checkInViewController в rootTabBarController или свойство rootViewController окна, так что он находится в воздухе (просто сохраняется вашим текущим объектом). Что происходит, когда этот (текущий) объект освобождается, но вид checkInViewController остается помещенным (сохраненным) в окне?

Если вы отпустите checkInViewController, но его вид все еще сохраняется в окне, вероятно, это создаст некоторые проблемы...

Об ошибке, я думаю, там где-то слабая ссылка (не сохраняется) на ваш объект, который действует на него после его освобождения.