Iphone - освобождается ли контроллер после нажатия? - PullRequest
0 голосов
/ 06 августа 2009

мой UIViewController освобождается, когда я вызываю другой контроллер? Как освободить память контроллера, когда я нажимаю на другой контроллер? Я беру более 40Мо и приложение уходит из-за НИЗКОЙ ПАМЯТИ (нет утечки).

[self.navigationController pushViewController:[[MainListController alloc] init:self] animated:NO];

@interface MainListController : UIViewController
...
- (id)init: (id)ref;

когда я вызываю функцию init, сделка с контроллером была такой:

[ref dealloc];

У меня есть эта ошибка:

objc[70754]: FREED(id): message isEqual: sent to freed object=0xe216b0
Program received signal:  “EXC_BAD_INSTRUCTION”.
  • (void) dealloc {[super dealloc];}

Ответы [ 2 ]

4 голосов
/ 06 августа 2009

Вы не можете (и не должны) освобождать / освобождать родительский контроллер представления, когда помещаете новый в стек навигации. Вы можете выгрузить представление, ответив на сообщение didReceiveMemoryWarning.

Есть несколько других проблем с вашим кодом:

  1. Никогда не звоните [obj dealloc] вручную. Всегда используйте [obj release].
  2. Ваше имя метода init должно быть более наглядным, чтобы не конфликтовать с предопределенным методом init. Вы также должны (возможно) строго ввести аргумент ref, если вам нужно его использовать. Что-то вроде (id)initWithParent:(UIViewController*)ref было бы лучше.
  3. Ваш код пропускает объект MainListController, поскольку вы выделяете / инициализируете его, а затем передаете его на navigationController. Измените свой код на [[[MainListController alloc] initWithParent:self] autorelease].
3 голосов
/ 06 августа 2009

Нет, вы не можете сдать UIViewControllers, которые не видны. Что происходит, когда контроллеры сверху отключаются от контроллера навигации? Что тогда будет отображать ОС?

Вместо этого вы должны реализовать метод didReceiveMemoryWarning во всех ваших контроллерах. Они должны release (не dealloc) как можно больше кэшированных данных. Все, что вы можете пересчитать или вернуть с диска, следует учитывать.

Это лучше, чем просто dealloc просмотр, который не виден, так как вы действительно не знаете, сколько памяти доступно заранее. На iPhone 3GS может остаться достаточно памяти даже при использовании 40 МБ.

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