Выгрузка ViewControllers из примера Apple PageControl + отношение UINavigationController к его RootViewControllers - PullRequest
0 голосов
/ 28 августа 2009

Поэтому я изменил пример Apple PageControl для динамической загрузки различных контроллеров навигации (вместе с их корневыми контроллерами представления) в представление прокрутки. Я также добавил технику, которая пытается разгрузить контроллер навигации, когда он больше не нужен. Я пробыл в ObjC чуть больше месяца, поэтому не уверен, правильно ли я выполняю разгрузку. Пожалуйста, смотрите мой код ниже, а затем мои вопросы.


Сначала я создаю изменяемый массив и заполняю его нулями, как это делает Apple:

// Create dummy array for viewControllers array, fill it with nulls, and assign to viewControllers
NSMutableArray *array = [[NSMutableArray alloc] init];
for (unsigned i = 0; i <= kNumberOfPages; i++)
{
    [array addObject:[NSNull null]];
}

self.viewControllers = array;
[array release];

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

id controller = [[classForViewController alloc] initWithNibName:NSStringFromClass(classForViewController) bundle:nil];
    navController = [[UINavigationController alloc] initWithRootViewController:controller];
    [controller release];
    [self.viewControllers replaceObjectAtIndex:page withObject:navController];
    [navController release];

... Наконец, если страницу больше не нужно загружать, я делаю это:

[self.viewControllers replaceObjectAtIndex:i withObject:[NSNull null]];

Вопросы:

  1. Насколько я понимаю, после замены контроллера навигации в моем массиве viewControllers на ноль массив освобождает контроллер навигации. Таким образом, счетчик удержания контроллера навигации достигает нуля, и он больше не занимает память. Это правильно?

  2. А как насчет корневого контроллера вида внутри контроллера навигации? Нужно ли что-то с ним делать, или он освобождается автоматически, когда счетчик удержания контроллера навигации достигает нуля?

Спасибо!

Ответы [ 2 ]

1 голос
/ 29 августа 2009
  1. Да. Любому объекту, помещенному в коллекцию, отправляется сообщение retain. Аналогично, любому объекту, удаленному из коллекции, отправляется сообщение release, причина удаления не имеет значения.
  2. Да, все объекты будут освобождать все объекты, которыми он владеет, когда они будут освобождены.

Все это сводится к простому принципу собственности, который определяет Какао:

  • Вы являетесь владельцем объекта, если получили его как возвращаемое значение, вызвав метод, который:
    1. Именуется alloc или new.
    2. Содержит слово copy , например copy и mutableCopy.
  • Вы владеете объектом, если вы звоните retain.
  • Вы можете вызывать release и autorelease только на принадлежащих вам объектах.
  • Вы должны освободить все принадлежащие объекты в ваших dealloc методах.

Есть только одно исключение; делегаты никогда не принадлежат. Это сделано для того, чтобы избежать циклических ссылок и утечек памяти, которые они вызывают.

В качестве побочного эффекта это также означает, что когда вы сами реализуете метод, вы должны вернуть автоматически освобожденный объект, если вы не реализуете new, или метод с copy в его названии. Объекты, возвращаемые как аргументы out, всегда автоматически высвобождаются.

Строго следуйте этому, и Objective-C может рассматриваться как мусор в 95% случаев.

0 голосов
/ 28 августа 2009

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

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

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