5

リクエストが終了した後、カスタム デリゲート オブジェクトを使用していくつかのクリーンアップ タスクを実行しています。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 のビルドと分析は、私がしていることに違和感を覚えます。

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 に設定すると、[自己保持] を実行します ...

于 2011-01-05T22:52:00.680 に答える