Objective c EXC“错误访问,标准c库”;开放式;在iphone上?

Objective c EXC“错误访问,标准c库”;开放式;在iphone上?,objective-c,c,ios,exc-bad-access,Objective C,C,Ios,Exc Bad Access,很简单的问题 无论我做什么,在尝试调用open()时应用程序都会崩溃,下面是相关代码的一部分。filename不是垃圾值,它包含文件的绝对路径。这在设备和模拟器上失败 文件名的printf返回: /用户/编程站7/库/应用程序支持/iPhone 模拟器/4.3/Applications/E2BD16DB-FFBA-45D2-B425-96C981380B85/Documents/issue2.zip 相关回溯: #0 0x002132dc in open () #1 0x000ddcec i

很简单的问题

无论我做什么,在尝试调用open()时应用程序都会崩溃,下面是相关代码的一部分。filename不是垃圾值,它包含文件的绝对路径。这在设备和模拟器上失败

文件名的printf返回:

/用户/编程站7/库/应用程序支持/iPhone 模拟器/4.3/Applications/E2BD16DB-FFBA-45D2-B425-96C981380B85/Documents/issue2.zip

相关回溯:

#0 0x002132dc in open () 

#1 0x000ddcec in -[ExternalZipInstaller
unzipTheFile] (self=0x68a8d60, _cmd=0x1483f3) at
ExternalZipInstaller.mm:261
代码:

#包括/*标准输入/输出定义*/
#include/*字符串函数定义*/
#include/*UNIX标准函数定义*/
#包含/*文件控制定义*/
#包括/*错误号定义*/
#包括/*POSIX终端控制定义*/
#ifndef O_二进制文件
#定义O_二进制0
#恩迪夫
-(void)解压缩文件
{
布尔成功=是;
常量字符*文件名=[self.zipName UTF8String];
打开(文件名,O|RDONLY | O|u二进制文件);
NSString的UTF8String方法的注释如下:

返回的C字符串会像返回的对象一样自动释放 将被释放;如果需要存储,则应复制C字符串 它位于自动释放上下文之外,在该上下文中,C字符串是 创造

我认为您需要将生成的字符串复制到您自己的缓冲区中,而不是仅仅指向它。ObjC垃圾回收器可能正在从您下面删除您的字符串。请尝试以下操作:

const char filename[MAX_PATH];
strcpy(filename, [self.zipName UTF8String], MAX_PATH);
open(filename, O_RDONLY | O_BINARY);

什么是完整堆栈跟踪?如果在调用
open
之前就调用
printf(“%s\n”,filename)
会发生什么?如果将正确的文件名硬编码为字符串文字会发生什么?这不是很有帮助,printf:“/Users/programmingstation7/Library/Application Support/iPhone Simulator/4.3/Applications/E2BD16DB-FFBA-45D2-B425-96C981380B85/Documents/issue2.zip”backtrace:
#0 0x00212dc处于打开状态()#1 0x000ddcec处于-[ExternalZipInstaller解压文件](self=0x68a8d60,_cmd=0x1483f3)在ExternalZipInstaller.mm:261,我也尝试过硬编码,同样的错误。您需要捕获
open()返回的文件描述符
,不是吗?只有当他打算在以后使用文件名时,这才是真的。在调用open时,文件名缓冲区是有效的,并且至少在方法调用结束之前是有效的(就像自动释放一样)。
const char filename[MAX_PATH];
strcpy(filename, [self.zipName UTF8String], MAX_PATH);
open(filename, O_RDONLY | O_BINARY);