как выпустить "делегировать" воспоминания в объективе-c? - PullRequest
6 голосов
/ 15 ноября 2010

Для моего проекта я создаю класс делегата. Когда я назначаю obj.delegate = self, [self retainCount] увеличивается на единицу. Таким образом, назначенный объект, имеющий счет сохранения, равен 2. Как освободить объект делегата, а назначенный объект остается равным 1?

С уважением Srini

Ответы [ 3 ]

8 голосов
/ 15 ноября 2010

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

Если вы используете свойство, объявите его следующим образом:

@property (assign) DelegateType delegate; // replace "DelegateType" with whatever type you need

И удалите строку в -dealloc, которая освобождает делегата.

Если средства доступа синтезированы, то все готово. Если нет, сделайте так, чтобы аксессоры присваивали аксессоры, например,

-(DelegateType) delegate
{
    return delegate;
}

-(void) setDelegate: (DelegateType) newValue
{
    delegate = newValue;
}
3 голосов
/ 15 ноября 2010

Как правило, вы не должны удерживать делегатов. Обычный шаблон - просто назначить их. В противном случае, как вы заметили, у вас возникнут всевозможные проблемы с циклами выпуска и т. Д.

1 голос
/ 15 ноября 2010

Как вы определяете аксессор для делегата

@property (nonatomic, retain) Whatever *delegate;

или

@property (nonatomic, assign) Whatever *delegate;

если это первое, то счетчик сохранений будет увеличен, а это не то, что вы хотите делать с делегатом. Создатель обязан удержать делегата. Вам только говорят об этом, и вы не должны сохранять это. Это только способность Obj C отправлять сообщения на ноль без сбоев, что означает, что вы не должны проверять ссылку перед использованием тоже.

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