Почему освобождение контроллера представления вызывает сбой? - PullRequest
2 голосов
/ 03 июня 2011

Я всегда помещаю новый контроллер представления в стек следующим образом:

 MyViewController *vc = [[MyViewController alloc] init];

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

[vc release];

И все работает хорошо, когда дело доходит до извлечения его из стека с помощью:

[self.navigationController popViewControllerAnimated:NO];

Но теперь, когда я вытаскиваю ВК из стека, у меня происходит сбой в main.m, сообщающий о плохом доступе в строке: int retVal = UIApplicationMain(argc, argv, nil, nil);

Но теперь, если я закомментирую [vc release], больше не произойдет сбой?

Но почему и наверняка это приводит к утечке памяти, так как я не выпускаю то, что я создал?

Ответы [ 5 ]

3 голосов
/ 03 июня 2011

Ваше управление памятью выглядит нормально.Возможно, вы неправильно управляете памятью о чем-то внутри своего виртуального канала.Как выглядит метод dealloc MyViewController?

Я предполагаю, что вы используете неправильный метод init (возможно, initWithNibName: bundle :), и вы выпускаете ivars в dealloc, которые никогда не были должным образом инициализированы.

0 голосов
/ 17 июня 2012

Возможно, вы неправильно управляете памятью о чем-то внутри своего видеомагнитофона.

Это предложение от @brandontreb действительно помогло мне!Я целый день изо всех сил пытался исправить ошибку после «Предупреждения о получении имитированной памяти», точно описанного как:
Предотвращение сбоя при неправильном доступе для popViewControllerAnimated в настройке контроллера uinavigation

pushView контроллера представления push :, передал self контроллера представления init: его dataSource:.

LayoutPickerDataSource *pickerDataSource = [[LayoutPickerDataSource alloc] initWithController:self];

, в то время как класс dataSource сохранил его следующим образом:

@property (nonatomic, retain) LayoutViewController *viewController;

Исправьте сбой, просто изменив на:

@property (nonatomic, assign) LayoutViewController *viewController;

и удалите:

[viewController release];

Бинго!Я до сих пор не знаю почему!Как viewController выпущен в dealloc: из dataSource.

0 голосов
/ 21 июля 2011

Причина, по которой они различаются, заключается в том, что вы не выделяете текстовые объекты и, следовательно, вы не являетесь владельцем. Работа МБ состоит в том, чтобы распределять и переоценивать их, что он и делает.

Так что если вы попытаетесь освободить его, это вызовет проблемы.

0 голосов
/ 03 июня 2011

Контроллер навигации сохранит vc, а затем, когда vc выдан, navigationController освобождает его и vc deallocs.

Итак, вы должны оставить код выпуска, это правильно.1007 *

Я думаю, вы должны использовать initWithNibName:bundle: вместо init.

0 голосов
/ 03 июня 2011

Вы пытались использовать его как

@property
...