5

我正在使用自定义委托对象在请求完成后执行一些清理任务。ASIHTTPRequest 不保留委托,因此我无法自动释放它们。现在这就是我分配和释放代表的方式。

应用代理

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

我的委托.m

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

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

有一个更好的方法吗?让代表自己释放似乎很难看,Xcode 的构建和分析对我正在做的事情感到不舒服。

4

3 回答 3

4

为什么你有一个单独的班级纯粹是为了代表?这不是委托对象通常的工作方式。通常创建 ASIHTTPRequest 的控制器成为委托,此时您不必担心释放它,因为它已经比 ASIHTTPRequest 寿命长(如果您的控制器在 ASIHTTPRequest 完成之前被释放,您需要取消请求)。

于 2011-01-05T22:09:40.107 回答
4

一种简单的方法是为您的主控制器(在本例中为应用程序委托)中的每个活动请求维护一组可变的委托:

@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
于 2011-01-05T23:07:26.327 回答
0

如果您不想为所有委托实例创建“控制器”类,我仍然至少会遵循内存约定规则,并在将委托设置为 asihhtprequest 后立即释放委托。然后我会在委托中包含一个属性,名称为 managesItsOwnLifetime (BOOL) 并且在将其设置为 YES 时我会执行 [self retain] ...

于 2011-01-05T22:52:00.680 回答