我写了以下声明:
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
答案 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}}调用方法)。