2013-08-04 2 views
0

В моем делегате приложения у меня есть один объект, который мне нужно использовать в некоторых разных 3-х мониторах. Чтобы использовать его я в интерфейсеObjective-c Делегат, используемый в некоторых viewController должен быть выпущен?

NewsPadAppDelegateiPad *delegate; 

и в осуществлении я

delegate = (NewsPadAppDelegateiPad *)[[UIApplication sharedApplication] delegate]; 
[delegate.reader setDelegate:self]; 
.... 
[delegate.reader doSomthing]; 

Когда в моем методе dealloc я

[delegate release]; 
delegate=nil; 

Я получаю ошибку

[CFString release]: message sent to deallocated instance 0x9d4fac0 

Мне действительно нужно это освободить?

+0

Вы не должны сохранять и освобождать делегата приложения. Он создан приложением и будет сохраняться до конца приложения без вашей помощи. Фактически, нет никакой реальной необходимости иметь переменную 'delegate' в ваших контроллерах представления. Вы можете повторно отображать указатель делегата всякий раз, когда вам это нужно, возможно, сохраняя его в локальной переменной в данном методе, но не в любом переменная экземпляра. –

ответ

0

Согласно Cocoa's memory management name convention, вы не являетесь владельцем объекта, поэтому не выпускаете его. Он будет выпущен для вас, когда он выходит за рамки.

+0

Создает ли мой код новый экземпляр моего делегата или это просто указатель? Я не хочу тратить память;) –

+0

@UsiUsi Это просто указатель. –

1

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

Это выглядит как код pre-ARC, поэтому вы должны просто избегать сохранения и освобождения вашего делегата.

В коде ARC вы должны объявить своих делегатов __weak, если у вас нет особых причин использовать сильные ссылки (в частности, вы сохраняете своего делегата, если хотите владеть делегирующим объектом, это очень редко - на самом деле это обычно другое наоборот).

Адрес good discussion of the topic on why delegates are not usually retained.

+0

Обратите внимание, что этот конкретный случай - это «делегат приложения», который создается при помощи UIApplication, когда приложение запускается и сохраняется до конца. Это, по сути, «синглтон». –

+0

@HotLicks Я думаю, что [другое исключение - 'CAAnimation'] (http://developer.apple.com/library/ios/#DOCUMENTATION/GraphicsImaging/Reference/CAAnimation_class/Introduction/Introduction.html) и модальные делегаты. – dasblinkenlight

Смежные вопросы