单身人士代表将无法工作

时间:2011-09-21 13:18:18

标签: objective-c delegates singleton

我有一个从外部数据库(PTDatabaseAccsesser)下载数据的单例。 当所有数据都被下载后,单例应该调用一个委托,它是UITableViewController的子类。但是,我收到了这个错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:
'-[__NSCFType doneDownloadingData]: unrecognized selector sent to instance... 

这是我如何将委托设置为UITableViewController的子类:

- (void)viewDidLoad {

    [[PTDatabaseAccesser sharedInstance] setDelegate:self];
    NSLog(@"%@", [[PTDatabaseAccesser sharedInstance] delegate]);
}

NSLog显示这里的一切都是正确的。

这是来自PTDatabaseAccsesser的代码,它调用委托:

NSLog(@"%@", [self delegate]);
[[self delegate] doneDownloadingData];

然而,NSLog显示该委托与上面的错误消息中的代理类型相同。

这就是我创建单身人士的方式:

static PTDatabaseAccesser *sharedInstance;

+ (PTDatabaseAccesser *)sharedInstance {

    @synchronized(self) {

        if (!sharedInstance) sharedInstance = [[PTDatabaseAccesser alloc] init];
    }

    return sharedInstance;
}

+ (id)alloc {

    @synchronized(self) {

        sharedInstance = [super alloc];
    }

    return sharedInstance;
}

我确保单例在上面的两个方法实现中使用断点来工作。

1 个答案:

答案 0 :(得分:0)

+ alloc中的代码似乎是不必要的,可能是错误的来源。从我所看到的情况来看,sharedInstance+alloc中获取其初始值,这意味着-sharedInstance中的if条件可能永远不会执行,并且您正在调用未初始化对象上的方法。请尝试使用此代码,这也恰好更有效。

static PTDatabaseAccesser *sharedInstance;

+ (void) initialize
{
   sharedInstance = [[PTDatabaseAccesser alloc] init];
}

+ (PTDatabaseAccesser *)sharedInstance 
{
    return sharedInstance;
}