我正在尝试构建一个用于处理所有 sqlite3 工作的类,但我遇到了一个我无法解释的 EXC_BAD_ACCESS。一般来说,我是 Objective-C 开发和内存管理的新手,所以如果这是一个愚蠢的问题,我深表歉意。
初始化类时,我获取数据库文件的路径并保留它:
NSArray * documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
databasePath = [[[documentPaths objectAtIndex:0] stringByAppendingPathComponent:@"Database.sql"] retain];
然后我尝试使用它,它在我身上崩溃了:
if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { // crashes
奇怪的是,不同函数中完全相同的行可以完美运行。我尝试将变量初始化添加到该行的上方,但无济于事:
NSArray * documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
databasePath = [[[documentPaths objectAtIndex:0] stringByAppendingPathComponent:@"Database.sql"] retain];
if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { // crashes
在这两种情况下,保留计数都是 2。
但是,在其中放置任何形式的静态文本都可以正常工作:
databasePath = @"I have a balloon";
if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { // fine
// or
if (sqlite3_open([@"APPLES!" UTF8String], &database) == SQLITE_OK) { // fine
更多的实验表明是UTF8String函数崩溃了,但我不明白为什么。
编辑:更多的实验使我能够调用UTF8String函数,但甚至不能使用结果:
const char * test = [databasePath UTF8String];
NSLog(@"%@", [NSString stringWithUTF8String:test]); // fine
if (sqlite3_open(test, &database) == SQLITE_OK) { // fails
编辑:搞砸了,发现问题出在我传递给函数的参数中。我到处都有断点,所以我 100% 确定它失败的点位于我指定的行,该行不使用传递的变量,但不知何故它导致一切都失败了。有时。我不知道它是怎么出错的,但我重写了整个东西,改变了我的函数调用,现在它可以工作了。
感谢所有回答的人。