[英]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.