Цель C: Как освободить делегатов в этой ситуации - PullRequest
5 голосов
/ 06 января 2011

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

Делегат приложения

MyDelegate *delegate = [[MyDelegate alloc] init];   
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:delegate];

MyDelegate.m

- (void)requestFinished:(ASIHTTPRequest *)request
{
    [self release];
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
    [self release];
}

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

Ответы [ 3 ]

4 голосов
/ 06 января 2011

Простой подход состоит в том, чтобы поддерживать изменяемый набор переменных для каждого активного запроса в вашем главном контроллере (в данном случае, в делегате приложения):

@interface MyAppController
{
    NSMutableSet * activeDelegates;
}
@end

@implementation MyAppController

- (id)init
{
    if ((self = [super init]) == nil) { return nil; }
    activeDelegates = [[NSMutableSet alloc] initWithCapacity:0];
    return self;
}

- (void)dealloc
{
    [activeDelegates release];
}

- (void)createRequest
{
    MyDelegate *delegate = [[MyDelegate alloc] init];
    [activeDelegates addObject:delegate];
    [delegate release];

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setDelegate:self];

    ...
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
    MyDelegate *delegate = [request delegate];
    [delegate doSomething];
    [activeDelegates removeObject:delegate];
{

- (void)requestFailed:(ASIHTTPRequest *)request
{
    [activeDelegates removeObject:[request delegate]];
}

@end
4 голосов
/ 06 января 2011

Почему у вас есть отдельный класс, чтобы быть делегатом? Это не так, как обычно работают объекты-делегаты. Обычно контроллер, создавший ASIHTTPRequest, становится делегатом, после чего вам не нужно беспокоиться об освобождении его, поскольку он уже переживет ASIHTTPRequest (и если ваш контроллер освобождается до того, как ASIHTTPRequest будет выполнен, вам нужно отменить запрос ).

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

Если вы не хотите создавать класс «controller» для всех ваших экземпляров делегата, я все равно по крайней мере следую правилам соглашения о памяти и освобождаю делегата сразу после установки его в asihhtprequest.Затем я включил бы в делегат свойство, которое имеет имя managesItsOwnLifetime (BOOL), и, установив для него значение YES, я бы сделал [self retain] ...

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