NSInvalidArgumentException ...如何正确定义参数?

时间:2011-04-27 18:24:45

标签: objective-c

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

  

错误:2011-04-27 11:18:03.226   PointPeek [174:707] * 终止应用   由于未被捕获的例外   'NSInvalidArgumentException',原因:   '+ [SQLiteDB addRecordToDatabase ::]:   无法识别的选择器发送到类   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) {


    }

2 个答案:

答案 0 :(得分:1)

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

假设addRecordToDabase::是一个类方法,而不是实例方法。

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

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

也就是说,应该避免裸:你应该总是指定参数的类型(而不是像你在这里那样回退到id。)

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


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

在任何情况下,评论中的问题都表明您确实需要从了解Objective-C开始。 Apple提供了excellent language guide

答案 1 :(得分:1)

  

错误:2011-04-27 11:18:03.226   PointPeek [174:707] *终止应用   由于未被捕获的例外   'NSInvalidArgumentException',原因:   '+ [SQLiteDB addRecordToDatabase ::]:   无法识别的选择器发送到类   0x1fe70'

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

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

- (void) addRecordToDatabase:data: typeName;

我们知道由于方法名称中的-(请参阅Methods and MessagingClass Interface)。在您收到的错误消息中,请注意它以+开头,这意味着您试图在SQLiteDB类本身上调用方法,而不是在该类的实例上调用。

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

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

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

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

(请注意,之前的两行代码本身并不是很有用。大概是,不是在这个方法中创建SQLiteDB的实例,而是将它作为实例变量)