热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iPhone模拟器中无法解释的EXC_BAD_ACCESS-InexplicableEXC_BAD_ACCESSintheiPhonesimulator

Imtryingtobuildaclassforhandlingallsqlite3workandIveencounteredanEXC_BAD_ACCESSwhi

I'm trying to build a class for handling all sqlite3 work and I've encountered an EXC_BAD_ACCESS which I just can't explain. I am new to Objective-C development and memory management in general so I apologize if this is a stupid question.

我正在尝试构建一个用于处理所有sqlite3工作的类,我遇到了一个我无法解释的EXC_BAD_ACCESS。我是Objective-C开发和内存管理的新手,所以我很抱歉这是一个愚蠢的问题。

When initializing the class I get the path to the database file and keep it around:

初始化类时,我获取数据库文件的路径并保持它:

NSArray * documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
databasePath = [[[documentPaths objectAtIndex:0] stringByAppendingPathComponent:@"Database.sql"] retain];

Then I try to use it and it crashes on me:

然后我尝试使用它,它崩溃了我:

if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { // crashes

The odd thing is that the exact same line in a different function works perfectly. I tried adding the variable initialization to above the line, but to no avail:

奇怪的是,不同功能中的完全相同的线路完美运行。我尝试将变量初始化添加到行上方,但无济于事:

NSArray * documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
databasePath = [[[documentPaths objectAtIndex:0] stringByAppendingPathComponent:@"Database.sql"] retain];

if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { // crashes

In both cases the retain count is 2.

在这两种情况下,保留计数为2。

However, putting any form of static text in there works fine:

但是,在其中放置任何形式的静态文本都可以正常工作:

databasePath = @"I have a balloon";
if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { // fine
// or
if (sqlite3_open([@"APPLES!" UTF8String], &database) == SQLITE_OK) { // fine

A little more experimentation revealed that it was the UTF8String function that was crashing, but I don't understand why.

多一点实验表明,UTF8String函数崩溃了,但我不明白为什么。

Edit: Even more experimentation resulted in me being able to call the UTF8String function but not even use the results:

编辑:更多的实验导致我能够调用UTF8String函数,但甚至不使用结果:

const char * test = [databasePath UTF8String];
NSLog(@"%@", [NSString stringWithUTF8String:test]); // fine
if (sqlite3_open(test, &database) == SQLITE_OK) { // fails

Edit: Messed around even more and discovered that the problem was in a parameter that I was passing to the function. I had breakpoints all over the place so I was 100% sure that the point it fails is at the line I specified, a line which doesn't use the passed variable, but somehow it caused everything to fail. Sometimes. I have no idea how it went wrong, but I rewrote the entire thing, changed my function call and now it works.

编辑:围绕更多,并发现问题是在我传递给函数的参数中。我到处都有断点,所以我100%确定它失败的点是在我指定的行,一行不使用传递的变量,但不知怎的,它导致一切都失败了。有时。我不知道它是怎么出错的,但我重写了整个事情,改变了我的函数调用,现在它工作了。

Thanks to all who answered.

感谢所有回答的人。

5 个解决方案

#1


1  

Have you checked the contents of the databasePath variable before the open call is made? Add an NSLog statement, or use the debugger, to find its value – it could be either NULL, which may not be handled by the sqlite3_open function, or it could even be that the crash is because the path is valid, and the database it points to is corrupt.

在打开调用之前,您是否检查了databasePath变量的内容?添加一个NSLog语句,或者使用调试器来查找它的值 - 它可能是NULL,可能是sqlite3_open函数无法处理的,或者甚至可能是因为路径有效而崩溃,而数据库是指向腐败。

#2


1  

My guess is that the database variable is not declared properly. It doesn't seem to have anything to do with the path to the database.

我的猜测是数据库变量未正确声明。它似乎与数据库的路径没有任何关系。

Did you declare database like this?:

你这样声明了数据库吗?:

sqlite3 *database;

#3


1  

I suspect you are chasing the wrong problem. You haven't shown a crash dump but claim that opening "APPLES!" is 'fine' which sounds odd - surely you don't have a database with that name?

我怀疑你正在追逐错误的问题。您没有显示崩溃转储但声称打开“APPLES!”是'很好'听起来很奇怪 - 当然你没有这个名字的数据库?

Are you sure you don't have a bad database file lying around - ie, the database file you are trying to open is corrupted in some way?

您确定没有错误的数据库文件 - 即,您尝试打开的数据库文件是否以某种方式损坏?

#4


1  

I think you have to post the crash log, your crash makes no sense. The code you posted should work.

我认为你必须发布崩溃日志,你的崩溃毫无意义。您发布的代码应该有效。

#5


0  

Try a copy instead of a retain on the variable - it'll make an immutable copy of the string so it shouldn't go changing or disappearing.

尝试复制而不是保留变量 - 它将生成字符串的不可变副本,因此它不应该改变或消失。

EDIT::

编辑::

What happens when you simply type

只需键入即会发生什么

if (sqlite3_open[@"myDatabase.sqlite" UTF8String], &database) == SQLITE_OK) {

Also are you sure that the

你还确定吗?

NSArray * documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
databasePath = [[[documentPaths objectAtIndex:0]
stringByAppendingPathComponent:@"Database.sql"] retain];

is actually returning where the database is?

实际上是返回数据库所在的位置?

The code I use to grab the database from the app directory where kFilename is the database file is:

我用来从app目录中获取数据库的代码是kFilename是数据库文件:

- (NSString *)dataFilePath{

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    return [documentsDirectory stringByAppendingPathComponent:kFilename];
}

and then to use it I do:

然后使用它我做:

if(sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK){

This works on both my iPod touch and the iPhone simulator.

这适用于我的iPod touch和iPhone模拟器。

EDIT2::

EDIT2 ::

I've just used your above method and it seems to work here - I know it sounds stupid but have you tried rebooting? Its possible something strange is happening with the simulator

我刚刚使用了你的上述方法,它似乎在这里工作 - 我知道它听起来很愚蠢,但你尝试重启吗?它可能在模拟器中发生了奇怪的事情


推荐阅读
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • NOIP2000的单词接龙问题与常见的成语接龙游戏有异曲同工之妙。题目要求在给定的一组单词中,从指定的起始字母开始,构建最长的“单词链”。每个单词在链中最多可出现两次。本文将详细解析该题目的解法,并分享学习过程中的心得体会。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 今天我开始学习Flutter,并在Android Studio 3.5.3中创建了一个新的Flutter项目。然而,在首次尝试运行时遇到了问题,Gradle任务 `assembleDebug` 执行失败,退出状态码为1。经过初步排查,发现可能是由于依赖项配置不当或Gradle版本不兼容导致的。为了解决这个问题,我计划检查项目的 `build.gradle` 文件,确保所有依赖项和插件版本都符合要求,并尝试更新Gradle版本。此外,还将验证环境变量配置是否正确,以确保开发环境的稳定性。 ... [详细]
  • MySQL数据库安装图文教程
    本文详细介绍了MySQL数据库的安装步骤。首先,用户需要打开已下载的MySQL安装文件,例如 `mysql-5.5.40-win32.msi`,并双击运行。接下来,在安装向导中选择安装类型,通常推荐选择“典型”安装选项,以确保大多数常用功能都能被正确安装。此外,文章还提供了详细的图文说明,帮助用户顺利完成整个安装过程,确保数据库系统能够稳定运行。 ... [详细]
  • 优化Vite 1.0至2.0升级过程中遇到的某些代码块过大问题解决方案
    本文详细探讨了在将项目从 Vite 1.0 升级到 2.0 的过程中,如何解决某些代码块过大的问题。通过具体的编码示例,文章提供了全面的解决方案,帮助开发者有效优化打包性能。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 如何使用mysql_nd:Python连接MySQL数据库的优雅指南
    无论是进行机器学习、Web开发还是爬虫项目,数据库操作都是必不可少的一环。本文将详细介绍如何使用Python通过 `mysql_nd` 库与 MySQL 数据库进行高效连接和数据交互。内容涵盖以下几个方面: ... [详细]
  • 如何在MySQL中选择合适的表空间以优化性能和管理效率
    在MySQL中,合理选择表空间对于提升表的管理和访问性能至关重要。表空间作为MySQL中用于组织和管理数据的一种机制,能够显著影响数据库的运行效率和维护便利性。通过科学地配置和使用表空间,可以优化存储结构,提高查询速度,简化数据管理流程,从而全面提升系统的整体性能。 ... [详细]
author-avatar
手机用户2602930515
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有