0

軽量で再利用可能なデリゲート モデルのオブジェクト + セレクター ホルダーとして機能する Callback クラスを作成しました。コードは次のとおりです。

#import <Foundation/Foundation.h>


@interface Callback : NSObject {

    id obj;
    SEL method;
}

@property(nonatomic,assign) id obj;
@property(nonatomic,assign) SEL method;

+(Callback*) new:(id) obj1 :(SEL)method1;

@end

そして、.m...

#import "Callback.h"

@implementation Callback

@synthesize obj;
@synthesize method;

+(Callback*) new:(id) obj1 :(SEL)method1{
    Callback * cb = [[Callback alloc] init];
    cb.obj= obj1;
    cb.method= method1;
    return [cb autorelease];
}

@end

アイデアは、[Callback new:self :@selector(mymethod:)] を渡すか、重いプロトコルの実装の代わりにコールバックの NSArray を渡すことができるということです。実際の動作例を次に示します。

-(void) storeInCache:(NSArray*) contacts{
    if (contacts != nil){
        // TODO
    }
}

- (void)viewDidLoad{
    [self.service request_getContacts:[Callback new:self :@selector(storeInCache:)]];
    // can fire off more requests on the common service class here
    // as long as I give separate Callback method references
}

私はそれを使用して、大量の非同期メソッド要求を実行する HTTP サービス クラスにパススルーしています。これで、私のサービス クラスは、非同期メソッドが返されたときに呼び出さなければならない Callback obj への弱い参照 (割り当て) を保持します。「Callback」オブジェクトが現在ゾンビであるかどうかをその時点で確認するにはどうすればよいですか? 私の一般的なアプローチはひどいですか?

4

1 に答える 1

1

Callbackオブジェクトが収集されたかどうかを確認することはできません。この概念は、ガベージコレクションでは意味がありません。オブジェクトにアクセスする方法がなくなるまで、オブジェクトは収集されません。インスタンス変数に修飾子を設定できます__weak。つまり、オブジェクトが収集されるとすぐに、変数はになりnilます。したがって、オブジェクト自体が収集されているのではなく、参照がnilであることを確認してください。

弱く参照されるオブジェクトのコレクションが必要な場合は、、、、またはを使用する必要がNSPointerArrayありNSHashTableますNSHashMap

于 2011-03-14T06:21:18.980 に答える