0

我正在使用 ios 5 上的 sqlite 数据库。我的应用程序所做的是它在文本字段中获取字符串并将其保存到数据库中。当我运行该应用程序时,它会崩溃并给出以下警告:

Thread1:程序接收信号“SIGBRT”

它在 main.m 和这一行中给出了这个:

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

有人可以帮我吗?将不胜感激!:( 我使用的是 xcode 4.2。

这是编译器说发生断言失败的方法。

- (void) addstrings{    
    if(addStmt == nil) {
    const char *sql = "insert into strings(strings) Values(?)";
    if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
        NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
    }

    sqlite3_bind_text(addStmt, 1, [strings UTF8String], -1, SQLITE_TRANSIENT);

    if(SQLITE_DONE != sqlite3_step(addStmt))
        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
    else
        //SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid
        strID = sqlite3_last_insert_rowid(database);

    //Reset the add statement.
    sqlite3_reset(addStmt);
}
4

2 回答 2

1

如果没有更多信息,就不可能准确地知道程序中发生了什么,但调用 abort() 的最常见原因是:

  1. 您向不支持/实现该消息的 Objective-C 对象发送消息。这会导致可怕的“无法识别的选择器发送到实例”错误。
  2. 你在某处有一个失败的断言。在定义宏 NDEBUG 的非调试版本中,标准库宏 assert(3) 在断言失败时调用 abort()。
  3. 您有一些内存踩踏/分配错误。当 malloc/free 检测到损坏的堆时,可能会调用 abort()。这意味着:您正在释放已经完成的内存,可能是通过向对象发送太多释放消息。另一件事是您可能无法将对象连接到 nib 中的 IBOutlet。我真的不能说,因为除了报告的错误之外,您没有提供任何其他信息。

  4. 您正在抛出未捕获的异常(C++ 异常或 Objective-C 异常)。

在几乎所有情况下,调试控制台都会为您提供有关导致 abort() 被调用的原因的更多信息,因此请务必查看那里。

于 2012-06-05T22:34:02.300 回答
0

SIGABRT错误可能在各种情况下发生,

就像你试图在DB没有打开的情况下关闭,或者试图在没有打开的情况下DB写入一些值。DBDB

或者可能是几个原因,所以在这里发布一些代码。

于 2012-06-06T09:20:06.847 回答