Безопасно ли выпустить UINavigationController? - PullRequest
0 голосов
/ 21 января 2011

Я создаю поповерный контроллер (UIPopoverController) и навигационный контроллер (UINavigationController) для поповера, где оба контроллера объявлены в заголовочном файле. Затем, когда они созданы:

myNavController = [[UINavigationController alloc] initWithRootViewController:[[[MyPopoverControllerClass alloc] initWithNibName:@"MyPopoverNib" bundle:[NSBundle mainBundle]]autorelease]];

myPopoverController = [[UIPopoverController alloc] initWithContentViewController:myNavController];

На данный момент, безопасно ли выпускать myNavController?

Ответы [ 3 ]

2 голосов
/ 21 января 2011

Вы можете освободить свой контроллер навигации после инициализации контроллера popover, если этот класс не будет ссылаться на него снова.

1 голос
/ 21 января 2011

Если myNavController является переменной экземпляра, вы не должны освобождать ее до тех пор, пока не будет использован dealloc метод. Если это просто локальная переменная, вы должны освободить ее после последней ссылки на нее в этом методе.

0 голосов
/ 22 января 2011

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

Другими словами, вы имеете все права на выпуск myNavController, как только он вам не нужен.

С другой стороны, UIPopoverController должен вступить во владение более myNavController, используя retain.

Итак, (снова) да. Вы можете спокойно отпустить myNavController.

В некоторых редких случаях правила соглашения о собственности не соблюдаются Подобные исключения упоминаются в документации для конкретных методов. Но здесь дело не в этом.

Позволяет применить эти правила к вашему фрагменту: В первой строке

  myNavController = [[UINavigationController alloc] initWithRootViewController:[[[MyPopoverControllerClass alloc] initWithNibName:@"MyPopoverNib" bundle:[NSBundle mainBundle]]autorelease]];

сохранить счет для myNavController равен как минимум 1.

Вторая строка

myPopoverController = [[UIPopoverController alloc] initWithContentViewController:myNavController];

приведет к тому, что счет myNavController будет составлять , по крайней мере, 2, в результате владения внутри initWithContentViewController.

...