Вопрос о делегатах - PullRequest
       11

Вопрос о делегатах

9 голосов
/ 19 апреля 2009

Этот код довольно прост, правильно? Я не знаю, следует ли мне сохранять делегата, переданного через метод init.

@interface SomeClass : NSObject {
    SomeClassDelegate *someClassDelegate;
}
-(id)initWithDelegate:(SomeClassDelegate *)delegate;
@end

@implementation SomeClass
-(id)initWithDelegate:(SomeClassDelegate *)delegate
{
    [delegate retain]; // should I be doing this?
    someClassDelegate = delegate;
}
-(void)dealloc
{
    [delegate release]; // obviously only do  this if I DO need to retain it
    [super dealloc];
}
@end

Моя первоначальная мысль - нет, однако этот фрагмент кода, похоже, намекает иначе. Я знаю, что не могу рассчитывать на счет, но хотелось бы знать, как правильно обращаться с делегатами.

// self's retain count is 1
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:req delegate:self];
// the retain count is now 2, did the init of URLConnection retain self?

Ответы [ 2 ]

11 голосов
/ 19 апреля 2009

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

Проверьте эти статьи для получения дополнительной информации об использовании / реализации делегатов.

РЕДАКТИРОВАТЬ: Есть несколько исключений, которые были отмечены другими.

1 голос
/ 21 апреля 2009

Как говорит htw, вы, как правило, не должны оставлять делегата. В многопоточной среде вам часто приходится сохранять все, что вам нужно, даже если только для продолжительности вызова метода, чтобы убедиться, что он не станет недействительным за вашей спиной. Если, например (не на самом деле), -[NSURLConnection initWithRequest:delegate] создал новый поток, который поток, возможно, сохранил (тогда, вероятно, будет автоматически освобождать) его параметры. В действительности, NSURLConnection является особым случаем, поскольку он сохраняет свой делегат на время соединения.

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