目标C:如何在这种情况下释放代表

Dav*_*vid 5 delegates release objective-c autorelease asihttprequest

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

App代表

MyDelegate *delegate = [[MyDelegate alloc] init];   
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:delegate];
Run Code Online (Sandbox Code Playgroud)

MyDelegate.m

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

- (void)requestFailed:(ASIHTTPRequest *)request
{
    [self release];
}
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?让代表们发布自己看起来很难看,Xcode的构建和分析让我感到不舒服.

e.J*_*mes 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
Run Code Online (Sandbox Code Playgroud)