объект viewController BAD_ACCESS в iOS5? - PullRequest
0 голосов
/ 22 декабря 2011

Обычно, когда мы нажимаем viewcontroller, мы создаем объект для контроллера представления, после этой строки мы его нажимаем и отпускаем.
Но он выходит из строя при запуске в iOS5.Таким образом, я сохранил объект через свойства и объявил его в интерфейсе как глобальный.Сейчас работает нормально.Будет ли сохранение viewcontroller занимать много памяти?В чем разница между следующими двумя подходами?

Один:

MyViewCOntroller *obj = [[MyViewCOntroller  alloc] init];
[self.navigationController pushViewController:obj Animated:YES];
[obj Release]

Два:

self.obj = [[MyViewCOntroller  alloc] init];
[self.navigationController pushViewController:self.obj Animated:YES];
[self.obj Release]

Ответы [ 4 ]

2 голосов
/ 22 декабря 2011

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

Что касается различия: во втором случае, если вы объявляете obj как переменную собственного класса и не используете ARC, вы заботитесь о obj, как и другие экземпляры vars. Вам просто нужно сделать релиз в dealloc.

1 голос
/ 22 декабря 2011

Вообще говоря, вы не должны выпускать property (self.obj) в методах, кроме dealloc.
Второй фрагмент кода должен быть заменен следующим образом:

self.obj = [[MyViewCOntroller alloc] init];
[self.navigationController pushViewController:self.obj Animated:YES];

И добавьте ниже одного к вашему dealloc методу:

self.obj = nil; // Property will release itself and set the point to nil

Первый фрагмент кода в порядке, вы выделили локальный экземпляр и освободили его после использования.

0 голосов
/ 22 декабря 2011

Передаете ли вы View Controller новому объекту?Если да, освобождаете ли вы это свойство View Controller в методе dealloc нового View Controller?Это будет двойной выпуск.Пример №2 решит эту проблему, поскольку свойство типа (retain), которое может иметься в старом View Controller, установит для его счетчика хранения значение 2.

0 голосов
/ 22 декабря 2011

почему вы не запускаете свой контроллер вида с помощью пера?

    SearchView *secondViewController = [[SearchView alloc] initWithNibName:@"SearchView" bundle:nil];
    [self.navigationController pushViewController:secondViewController animated:YES];
    [secondViewController release];

будьте осторожны с сохранением любых предметов. Вы должны быть полностью уверены, что инициируете его только один раз, а затем отпускаете. Если вы это сделаете, вы можете не заботиться о памяти. Разница между вашими начальными элементами: в первом случае вы создаете объект. Это не сохранить, но, может быть, утечка, я не уверен. Я думаю, что вы должны добавить autorelease. Во втором случае у вас есть свойство объекта (вероятно, сохранить?) В заголовке. Вы должны выпустить его в dealloc методе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...