Thread1:程序接收信号“SIGABRT”

时间:2012-06-05 19:31:39

标签: objective-c ios5 sqlite xcode4.2

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

  

线程1:程序接收信号“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);
}

2 个答案:

答案 0 :(得分:1)

在没有更多信息的情况下,无法准确判断程序中发生了什么,但abort()被调用的最常见原因是:

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

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

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

答案 1 :(得分:0)

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

就像您试图在不打开DB的情况下关闭DB,或尝试在不打开DB的情况下向DB写一些值。

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