为什么我不能从AppDelegate调用对象方法?没有已知的类选择器方法
问题描述:
我有一个类似单例的DataHandler
类,它有sharedHandler
对象方法。我在整个项目中都使用它,但出于某种原因,我无法在AppDelegate中使用它。为什么我不能从AppDelegate调用对象方法?没有已知的类选择器方法
DataHandler.h
#import <Foundation/Foundation.h>
@interface DataHandler : NSObject
+ (id)sharedHandler;
- (void)logout;
@end
DataHandler.m
#import "DataHandler.h"
/**
* Singleton static method
* @return singleton instance
*/
+ (id)sharedHandler {
static DataHandler *sharedHandler = nil;
@synchronized (self) {
if (sharedHandler == nil)
sharedHandler = [[self alloc] init];
}
return sharedHandler;
}
-(void) logout {
// ...
}
@end
AppDelegate.m
#import "AppDelegate.h"
#import "DataHandler.h"
@implementation AppDelegate {
- (void)applicationWillResignActive:(UIApplication *)application {
[[DataHandler sharedHandler] logout];
}
@end
我不断收到:
Error: no known class method for selector 'sharedHandler`
Error: no known instance method for selector 'logout'
这种行为的原因是什么?
答
您有两个文件名为DataHandler.h
,导入AppDelegate.m
正在拾取错误的文件。请注意,它可能正在拾取实际上不在项目中的文件,只要它位于磁盘上的文件夹中即可。
+0
谢谢凯文,那正是发生了什么事。我没有在AppCode中看到该文件,并且因为它在存储在项目子目录中的其他类中工作,所以我没有预料到原因。 – Krystian
您没有两个名为'DataHandler.h'的文件,是吗? –
我无法重现此问题。确保在'DataHandler.m'上设置了正确的目标成员资格。另外,使用dispatch_once代替创建单例时:http://blog.bjhomer.com/2011/09/synchronized-vs-dispatchonce.html – JAL
目标设置良好,就像我说过的,我在项目中随处使用这个类,并从AppDelegate中删除它使项目生成并正常工作。 @KevinBallard你是对的...在我更新了git两个模板文件后,DataHandler.h和.m出现在我的项目的根目录中,这些项目没有添加到项目导航器中,所以我没有看到它们。我用Finder搜索它,它出现了......我不会猜到它:/谢谢 – Krystian