未找到xcode选择器

时间:2015-05-22 12:08:05

标签: objective-c xcode selector

我写了以下声明:

int  kk = [MartialArtsCheckInAppPurchaseKey scrambledKey:0];

当Xcode执行该语句时,它会运行到以下崩溃异常消息。

  

2015-05-22 19:46:02.386 HanDynastyMartialArts [2779:107363] +   [MartialArtsCheckInAppPurchaseKey scrambledKey:]:无法识别的选择器发送到类0x10e824878   2015-05-22 19:46:02.390 HanDynastyMartialArts [2779:107363] *   由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'+ [MartialArtsCheckInAppPurchaseKey scrambledKey:]:无法识别的选择器发送到类0x10e824878'   * 首先抛出调用堆栈:

在我的MartialArtsCheckInAppPurchaseKey.h中,我有以下声明:

// extern int  scrambledKey(int n);


@interface MartialArtsCheckInAppPurchaseKey : NSObject {

}

+(int)  scrambledKey:(int) n;
+(BOOL) scrambledMatch: (int) key;


+(int)  getKeyElement:(int) n;
+(int)  getUIDKeyIndex:(int) n;
+(BOOL) checkInAppPurchaseKey: (int)key;
+(void) setInAppPurchaseKey: (int) key : (BOOL) value;

@end

Xcode抱怨的选择器在MartialArtsCheckInAppPurchaseKey.m中声明如下。

- (int)  scrambledKey:(int) n {
  ... 
}
/* scrambledKey */

有人可以帮我解决这个问题并告诉我出了什么问题吗? 还有为什么有时我们用'+'和' - '声明头文件中的方法? 有什么不同 ?

谢谢

Farn

2 个答案:

答案 0 :(得分:1)

-scrambledKey:是一个实例方法(不是静态方法)。 您需要创建MartialArtsCheckInAppPurchaseKey的实例,然后在其实例

上调用该方法
MartialArtsCheckInAppPurchaseKey *obj = [MartialArtsCheckInAppPurchaseKey new]
int  kk = [obj scrambledKey:0];

还请注意,接口声明(在MartialArtsCheckInAppPurchaseKey.h文件中)是错误的,你需要像这样纠正它

// extern int  scrambledKey(int n);


@interface MartialArtsCheckInAppPurchaseKey : NSObject {

}

// NOTE: I've changed + -> -
-(int)  scrambledKey:(int) n;
+(BOOL) scrambledMatch: (int) key;


+(int)  getKeyElement:(int) n;
+(int)  getUIDKeyIndex:(int) n;
+(BOOL) checkInAppPurchaseKey: (int)key;
+(void) setInAppPurchaseKey: (int) key : (BOOL) value;

@end

答案 1 :(得分:1)

scrambledKey声明:

+(int)  scrambledKey:(int) n;

告诉编译器该方法是一类(+代表类方法,-代表实例方法)。因此,在运行时,您会收到unrecognised selector异常,因为没有名为scrambledKey的类方法(声明方法并不意味着该方法存在)。

但是,您将作为实例方法实现。因此,根据您的需要,您必须更改方法的声明或其实现。考虑到调用者代码使用类方法,更改方法实现代码(简单地用-替换+)将需要较少的修改。这假设实现并不依赖于MartialArtsCheckInAppPurchaseKey的实例成员,当您被迫更改定义(将+替换为-时),请使用{的实例{1}}调用方法)。