0

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

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

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

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

ответ

2

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

+0

В MyPopoverControllerClass я вызываю pushViewController на myNavController после того, как он создан, и пользователь нажимает на элемент, который отображается на popover ... так что не следует ли здесь отключать myNavController? – John

1

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

+0

Точно; если у вас есть сохраненная ссылка, вы «владеете» объектом. Если эта ссылка больше не нужна, вы должны ее освободить. Если это переменная экземпляра, и вы 'release' за пределами' dealloc', также неплохо назначить 'nil' переменной экземпляра, чтобы вы не попали в висячий указатель. – bbum

0

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

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

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

Итак, (еще раз) да. Вы можете смело освободить myNavController.

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

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

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

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

Вторая линия

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

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

+0

Do * not * называть 'keepCount'. Учитывая, что 'UIPopoverController' является классом из структуры UIKit, счетчик удержания в любой момент времени является полностью детализацией реализации. Попытка присвоить значение абсолютному значению бесполезно. Думайте о сохранении полностью как собственности и дельт; если вам больше не нужно владеть объектом, вы его отпустите. – bbum

+0

@bbum: 'UIPopoverController' наследует от' NSObject', поэтому можно передать сообщение 'keepCount'. Выражения, которые я использовал здесь, например '[x keepCount]', являются исключительно иллюстративными и имеют смысл, что объект имеет ** как минимум ** это значение. И, пожалуйста, покажите мне, что именно я пытаюсь назначить? –

+0

Вы сказали, что «приведет к тому, что myNavController будет считаться равным 2».Это неправильное предположение. Недопустимо пропускать keepCount и ожидать данного абсолютного значения. Это плохой (неверный) совет по другому правильному правильному ответу – bbum