【发布时间】:2009-12-30 14:12:28
【问题描述】:
我正在尝试构建一个类来处理所有 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% 确定它失败的点位于我指定的行,该行不使用传递的变量,但不知何故它导致一切都失败了。有时。我不知道它是怎么出错的,但我重写了整个东西,改变了我的函数调用,现在它可以工作了。
感谢所有回答的人。
【问题讨论】:
-
我不确定这是否是问题所在,但如果 documentPaths 为 nil,则您调用 sqlite3_open 时第一个参数为空。
标签: iphone objective-c sqlite memory-management exc-bad-access