繁体   English   中英

NSInvalidArgumentException... 我如何正确定义 arguments?

[英]NSInvalidArgumentException… how do I define the arguments correctly?

我在以下代码中遇到此异常。 我想是因为我没有定义两个传入的参数类型。 他们是本地的; 那么我该如何定义它们(以及在哪里)。

错误:2011-04-27 11:18:03.226 PointPeek [174:707] *由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“+ [SQLiteDB addRecordToDatabase::]:无法识别的选择器发送到 class 0x1fe70”

这是代码的调用行:

[SQLiteDB addRecordToDatabase: symbol.data: symbol.typeName];

这是我正在调用的方法:

- (void) addRecordToDatabase:data: typeName  {

    NSString *insertCommand = [NSString stringWithFormat:@"INSERT INTO CardData (CARD_ID, CARD_NAME, CODE_VAL) VALUES ('/%@', '/%@', '/%@')", data, @"Test Card", typeName];
    if(sqlite3_open_v2(cDatabasePath, &db, SQLITE_OPEN_READWRITE, NULL) == SQLITE_OK) {


    }

[SQLiteDB addRecordToDatabase: symbol.data: symbol.typeName];

假设addRecordToDabase::是 class 方法,而不是实例方法。

此外,这是一个糟糕的方法名称。 尝试类似:

- (void)addRecordWithData:(NSData*)aData andType:(NSString*)aType;

也就是说,要避免使用 bare:s,并且您应该始终指定参数的类型(而不是像您在此处所做的那样回退到id )。

最后,您为什么不使用 Core Data,或者至少不使用 FMDB? 原始 SQLite 是浪费时间。


SQLite 很可能比 Core Data 更难编写代码。 如果您是两者的新手,Core Data 是您时间投资的更好回报。

无论如何,您评论中的问题表明您确实需要从了解 Objective-C 开始。 Apple 提供了出色的语言指南

错误:2011-04-27 11:18:03.226 PointPeek [174:707] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“+ [SQLiteDB addRecordToDatabase::]:无法识别的选择器发送到 class 0x1fe70”

基本上,“ unrecognized selector sent to... ”消息意味着您试图告诉 object(或类)做一些它不知道该怎么做的事情。 (“选择器”是方法的另一个名称)。

您将SQLiteDB class 的方法定义为实例方法:

- (void) addRecordToDatabase:data: typeName;

我们知道这是因为方法名称中的- (请参阅方法和消息传递Class 接口)。 在您收到的错误消息中,请注意它以 + 开头,这意味着您尝试在SQLiteDB class 本身上调用方法,而不是在该 class 的实例上调用方法。

换句话说,您试图这样做:

[SQLiteDB addRecordToDatabase: symbol.data: symbol.typeName];

当你需要做这样的事情时:

SQLiteDB *db = [[[SQLiteDB alloc] init] autorelease]; // an instance
[db addRecordToDatabase: symbol.data: symbol.typeName];

(请注意,前两行代码本身并没有那么有用。据推测,不是在此方法中创建SQLiteDB的实例,而是将其作为实例变量)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM