ViewController никогда не освобождается

На мой взгляд, myViewController должен быть освобожден примерно в то время, когда я возвращаюсь к корневому контроллеру представления с помощью следующего кода, но я никогда не вижу сообщения об освобождении, получающего NSLogged.

Если это должно сработать, то какую проблему я могу найти в классе myViewController, которая может привести к его освобождению, когда я использую popToRootViewController?

Спасибо.

В моем tableView вызывается следующее:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

MyViewController *vc = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];

[self.navigationController pushViewController:vc animated:YES];

[vc release];
}

ОБНОВИТЬ:

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


person JaySmith02    schedule 27.12.2011    source источник
comment
Когда вы находитесь на другом контроллере представления на навигационном контроллере, если вы используете аппаратное обеспечение симулятора iOS, выберите Предупреждение о симуляции памяти, а затем проверьте его. Контроллер навигации освободит ваш контроллер представления (если это не корневой контроллер представления), если ваше приложение получит предупреждение о памяти.   -  person 0x8badf00d    schedule 27.12.2011
comment
в коде, который вы показали, нет проблем. Нужно посмотреть код в MyViewController — возможно, вы сохранили контроллер где-то в своих собственных методах.   -  person Saurabh Passolia    schedule 27.12.2011
comment
Вызывается Предупреждение об имитации памяти, по-прежнему не освобождается. Я думаю, мне следует проверить свойства myViewController дальше.   -  person JaySmith02    schedule 27.12.2011
comment
Интересно... так что в основном одним из свойств myViewController является @property (неатомарное, сохраняемое) ScrollViewViewController *scrollViewViewController; Это основное представление внутри myViewController, где происходят все действия. Когда я переключил это на назначение вместо сохранения, myViewController освобождается, когда я popToRootViewController, но затем я получаю сбой.   -  person JaySmith02    schedule 27.12.2011
comment
Я предполагаю, что у вас есть более одного myViewController, возможно, из [self.navigationControll pushViewController:vc...], у меня такое ощущение, что сообщение Dealloc будет отправлено только тогда, когда счетчик ссылок равен нулю. Не уверен, что это где-то рядом правильно, так что это не ответ :-) будет интересно посмотреть, что скажут другие   -  person T I    schedule 27.12.2011
comment
Я больше не получаю сбой, когда он освобождается, потому что я удалил сообщение о выпуске, которое ранее заботилось о сохранении свойства в методе Dealloc. Теперь myViewController полностью освобождается, но scrollViewViewController никогда не освобождается вместе с ним.   -  person JaySmith02    schedule 27.12.2011
comment
@ JaySmith02 JaySmith02 похоже, у вас есть цикл сохранения между MyViewController и ScrollViewViewController. Вы исправили это (плохо), но вы должны исправить это правильно. Если вы покажете эти два контроллера и отношения между ними, я уверен, что кто-то может помочь.   -  person Firoze Lafeer    schedule 27.12.2011
comment
Итак, вы правы... Теперь у меня есть и MyViewController, и ScrollViewViewController, которые освобождаются вместе, когда я popToRootViewController, именно то, что я хочу. Но... вы говорите, что я сделал это плохо (т.е. я просто изменил свойства с сохранения на назначение; кстати, ScrollViewViewController не освобождался, потому что у него также было сохраненное свойство под названием OwnerView, которое сохраняло ссылку на MyViewController.Как только я сделал это свойство назначенным, оба были освобождены.) Каков будет правильный способ решения этой проблемы? (код дам в следующем ответе)   -  person JaySmith02    schedule 27.12.2011
comment
В методе viewDidLoad MyViewController я вызываю self.scrollViewViewController_iPhone = [[ScrollViewViewController_iPhone alloc] initWithNibName:@ScrollViewViewController_iPhone bundle:nil]; чтобы выделить наше подвид прокрутки. Затем в методе SetUpScrollView я добавляю его к экземпляру UIScrollView, созданному через IB (сохраненное свойство IBOutlet MyCustomViewController) со следующим кодом: [self.scrollView addSubview:[self.scrollViewViewController_iPhone view]];   -  person JaySmith02    schedule 27.12.2011
comment
@ JaySmith02 JaySmith02 это зависит от того, сколько и какие свойства вы изменили для назначения. Ранее я сказал плохо, потому что раньше вы пропускали ScrollViewViewController. Если вы исправили эту проблему с тех пор, то вполне возможно, что сейчас вы делаете это правильно. Пожалуйста, отредактируйте дополнительный код в исходном вопросе, чтобы люди могли его прочитать.   -  person Firoze Lafeer    schedule 27.12.2011
comment
Кроме того, в том же методе я делаю следующее: [self.scrollViewViewController_iPhone setOwnerView:self]; чтобы scrollViewViewController мог получить доступ к некоторым свойствам myViewController.   -  person JaySmith02    schedule 27.12.2011
comment
Да, единственными свойствами, которые я изменил для назначения, были (неатомарные, сохраняемые) ScrollViewViewController_iPhone *scrollViewViewController_iPhone и (неатомарные, сохраняемые) MyViewController *ownerView. Я также избавился от авторелизов, когда выделял и устанавливал сохраненные свойства, и сохранял релиз и nil в методе Dealloc. Кажется, теперь все работает нормально, спасибо.   -  person JaySmith02    schedule 27.12.2011
comment
@ JaySmith02, вам не нужно было менять оба. Я бы просто изменил свойство «ownerView». Вам нужно/хотите разорвать только одно звено цикла сохранения. Если это не сработает, то, вероятно, у вас есть и другие проблемы с памятью.   -  person Firoze Lafeer    schedule 27.12.2011
comment
Спасибо, попробую поменять обратно, а там посмотрим.   -  person JaySmith02    schedule 27.12.2011
comment
Да, я изменил свойство ScrollViewViewController обратно, чтобы сохранить, снова добавил автоматическое освобождение при распределении и оставил ownerView в качестве назначенного. Все еще освобождаю оба в нужное время, спасибо!   -  person JaySmith02    schedule 27.12.2011


Ответы (2)


Когда вы используете poptoviewcontroller, тогда метод Dealloc вызовет самый верхний контроллер представления в контроллере навигации. Вы можете поставить точку останова в методе Dealloc вашего текущего контроллера представления, и когда вы вызвали popviewcontroller, тогда ваш метод Dealloc вызывается и освобождает все материалы/переменные, которые вы создали в своем контроллере представления.

person Sandeep Dhama    schedule 27.12.2011

@JaySmith02 прав

это было какое-то плохое управление памятью в моих пользовательских контроллерах представления, из-за чего ни один из них не был выпущен. У меня были некоторые сохраненные свойства, которые должны были быть назначены вместо этого (или, по крайней мере, так я это решил)

В моем случае виновником был

@property (nonatomic, retain) id<TTSlidingPagesDataSource> dataSource;

С моего viewController, когда я писал

slidingPages.dataSource = self

Я предполагаю, что dataSource сохранил мой viewController и сделал круговую ретенцию. «Dealloc» моего viewController никогда не вызывался.

Примечание. В ARC вызывается dealloc. Разница в том, что вы не можете позвонить [super dealloc]

Решение:

@property (nonatomic, assign) id<TTSlidingPagesDataSource> dataSource;
person Community    schedule 15.09.2013