0

我制作了一个回调类,用作轻量级可重用委托模型的对象+选择器持有者。这是代码:

#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

还有他们...

#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 服务类,该类执行一大堆异步方法请求。现在,我的服务类对异步方法返回时必须调用的回调 obj 保持弱引用(分配)。那时我如何检查“回调”obj现在是否是僵尸?我的一般方法很糟糕吗?

4

1 回答 1

1

您无法检查您的Callback对象是否已被收集。这个概念在垃圾收集下是没有意义的——除非你没有剩余的方法来访问该对象,否则该对象不会被收集。您可以__weak限定符放在您的实例变量上,这意味着一旦收集了对象,该变量将变为nil. 所以检查引用是否为零,而不是对象本身已被收集。

如果需要弱引用对象的集合,则需要使用NSPointerArrayNSHashTableNSHashMap.

于 2011-03-14T06:21:18.980 回答