为什么我不能从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' 

这种行为的原因是什么?

+0

您没有两个名为'DataHandler.h'的文件,是吗? –

+0

我无法重现此问题。确保在'DataHandler.m'上设置了正确的目标成员资格。另外,使用dispatch_once代替创建单例时:http://blog.bjhomer.com/2011/09/synchronized-vs-dispatchonce.html – JAL

+0

目标设置良好,就像我说过的,我在项目中随处使用这个类,并从AppDelegate中删除它使项目生成并正常工作。 @KevinBallard你是对的...在我更新了git两个模板文件后,DataHandler.h和.m出现在我的项目的根目录中,这些项目没有添加到项目导航器中,所以我没有看到它们。我用Finder搜索它,它出现了......我不会猜到它:/谢谢 – Krystian

您有两个文件名为DataHandler.h,导入AppDelegate.m正在拾取错误的文件。请注意,它可能正在拾取实际上不在项目中的文件,只要它位于磁盘上的文件夹中即可。

+0

谢谢凯文,那正是发生了什么事。我没有在AppCode中看到该文件,并且因为它在存储在项目子目录中的其他类中工作,所以我没有预料到原因。 – Krystian