我有一个从外部数据库(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;
}
我确保单例在上面的两个方法实现中使用断点来工作。
答案 0 :(得分:0)
+ alloc中的代码似乎是不必要的,可能是错误的来源。从我所看到的情况来看,sharedInstance
在+alloc
中获取其初始值,这意味着-sharedInstance
中的if条件可能永远不会执行,并且您正在调用未初始化对象上的方法。请尝试使用此代码,这也恰好更有效。
static PTDatabaseAccesser *sharedInstance;
+ (void) initialize
{
sharedInstance = [[PTDatabaseAccesser alloc] init];
}
+ (PTDatabaseAccesser *)sharedInstance
{
return sharedInstance;
}