如果Obj-C对象不再存在(已收集),我们如何以编程方式检查

时间:2011-03-14 06:07:35

标签: iphone objective-c nszombie

我创建了一个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的Callbacks,而不是一个重量级的协议实现。以下是它的一个实例:

-(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 Service类,它执行一大堆异步方法请求。现在我的服务类保持弱引用(赋值)到异步方法返回时必须调用的Callback obj。那个时候我怎么检查'Callback'obj现在是不是僵尸?我的一般做法可怕吗?

1 个答案:

答案 0 :(得分:1)

您无法检查是否已收集Callback个对象。这个概念在垃圾收集下没有意义 - 在您没有剩余的方法来访问对象之前,不会收集该对象。您可以__weak限定符放在您的实例变量上,这意味着只要收集了该对象,该变量就会变为nil。因此,请检查引用是否为nil,而不是已经收集的对象本身。

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