Когда выпустить деталиViewController - PullRequest
0 голосов
/ 26 августа 2010

В моем приложении для iPhone есть RootViewController и DetailsViewController.Я использую инструмент «Распределение», чтобы контролировать потребление памяти, и у меня возникает вопрос.

Когда мое приложение запускается, оно занимает около 4 МБ памяти, когда я выбираю элемент в RootViewController, оно загружает UIWebView в DetailsViewController и объем памяти увеличивается до 10 МБ,после того, как я возвращаюсь в RootViewController, память остается на уровне 10 Мб, а DetailsViewController имеет retainCount = 2 (хотя я создаю его только один раз).

Как мне освободить эту память?Я знаю, что должен делать это, если мои приложения получают предупреждение о памяти, но я создаю этот ViewController, используя initWithNibName:, поэтому я понимаю, что не должен отправлять release.

Спасибо.

Редактировать

Я загружаю это так:

if (self.detailsViewController == nil)
{        
detailsViewController *d = [[detailsViewController alloc] 
      initWithNibName:@"DetailsViewController" 
      bundle:[NSBundle mainBundle]];

self.detailsViewController = d;
[d release];

self.detailsViewController.urlToLoad = urlToLoad;
}
[self.navigationController pushViewController: self.detailsViewController animated:YES];

Ответы [ 4 ]

1 голос
/ 26 августа 2010

Попробуй это.detailsViewController = ноль;DetailsViewController * d = [[DetailsViewController alloc] initWithNibName: @ "DetailsViewController" bundle: [NSBundle mainBundle]];

self.detailsViewController = d;
[d release];

detailsViewController.urlToLoad = urlToLoad;
}
[self.navigationController pushViewController: detailsViewController animated:YES];
[detailsViewController release];
1 голос
/ 26 августа 2010

Как вы показываете DetailsViewContoller?Через pushViewController:...?Если да, вы должны отпустить его сразу после нажатия, потому что pushViewController:... сохраняет его.

1 голос
/ 26 августа 2010

Некоторый код поможет с этим - иначе мы просто догадываемся о том, что вы делаете.

Вообще говоря, когда вы добавляете UIViewController в UINavigationController, этот ViewController сохраняется, и вы должныотпустите это.Если вы добавляете VIEW UIViewController в качестве подпредставления другого представления, этот VIEW сохраняется, но не ViewController.

Итог: если вы говорите alloc НИЧЕМУ, вы должны сделать это release позже.Это правило.Также copy и new, и все, что вы явно retain.

Я настоятельно не рекомендую отслеживать сохранность самостоятельно.Вещи хранятся и публикуются за кулисами по причинам, которые имеют очень мало общего с тем, что происходит в ваших классах, и вы увидите, как эти числа меняются очень запутанно.Лучше всего убедиться, что баланс ВАШЕГО кода сохраняется и деблокируется.Все ваши скобки должны быть сбалансированы, верно?Так что делайте все ваши распределения и релизы.Просто компилятор проверяет одну из них за вас, а вы самостоятельно за другую.

1 голос
/ 26 августа 2010

Используете ли вы

DetailViewController *dvc = [[DetailViewController alloc] initWithNibName:NIB_NAME bundle:[NSBundle mainbundle]];

Тогда вы должны выпустить dvc.Запомните alloc.

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

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