加载数据 EXC BAD ACCESS(仅限设备)

Posted

技术标签:

【中文标题】加载数据 EXC BAD ACCESS(仅限设备)【英文标题】:Load data EXC BAD ACCESS (only device) 【发布时间】:2011-03-11 19:14:19 【问题描述】:

当我的自定义数据在 iPhone(3G,3.1)上加载时,我得到 Exc Bad Access 在这一行:

NSMutableArray* dataArr = [NSKeyedUnarchiver unarchiveObjectWithFile:pathGG]; //=EXC BAD ACCESS

在 Ipad 和模拟器上工作

我在模拟器中保存数据(到documentsDirectory路径),然后将数据替换到项目,并从[NSBundle mainBundle]加载

在数组中我使用 NSValue 来存储 CGPoint。

完整来源:

-(void) SaveData:(NSMutableArray*)dataLevel 
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentsDirectory = [paths objectAtIndex:0];
NSString* fileName = @"data.dat";
NSString* pathGG = [documentsDirectory stringByAppendingPathComponent:fileName]; // retain];

BOOL isWrite = [NSKeyedArchiver archiveRootObject:dataLevel toFile:pathGG];

if(isWrite) NSLog(@"YES");  
else  NSLog(@"!!!");


+(NSMutableArray*) LoadData  
NSString* fileName = @"data.dat"; 
NSString* pathGG =  [[NSBundle mainBundle] pathForResource:fileName ofType:@"dat"]; // retain];
NSMutableArray* dataA = [NSKeyedUnarchiver unarchiveObjectWithFile:pathGG];  //EXC BAD ACCESS

return dataA;

如果我使用跟随方式(保存/加载相同的方法),我也会得到 EXC BAD ACCESS:

NSKeyedUnarchiver* decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
NSArray* dataArr = [decoder decodeObjectForKey:@"dataLevel"]; //EXC BAD ACCESS

【问题讨论】:

调试检查这些变量/指针是否为 NIL 在保存方法中所有变量都不为零。在加载方法中,pathGG 不是 nil,(顺便说一下,如果找不到文件,我不会得到 EXC BAD ACCESS)。我注意到,当我在模拟器中调试时,第一秒内 dataArr 的值“无效总和”,但在一些字节之后。 【参考方案1】:

试试这个:

NSString* pathGG = [[documentsDirectory stringByAppendingPathComponent:fileName] retain];

然后当你完成它时:

[pathGG release]

【讨论】:

我在模拟器中保存数据(到documentsDirectory路径),然后将数据替换到项目中,并从Iphone上的[NSBundle mainBundle]加载。【参考方案2】:

解决方案:不要将CGPoint 存储在NSValue 中,而是使用CGPointFromString(在NSStringFromCGPoint 之后),然后将字符串添加到数组中。

NSString* positionStr = NSStringFromCGPoint(someCGPoint); 
[someArray addObject:position];
// Now, saving array to file
...

//从文件中加载数组后

CGPoint positon = CGPointFromString([someArr objectAtIndex:0]);                  

【讨论】:

这不能回答你的问题。

以上是关于加载数据 EXC BAD ACCESS(仅限设备)的主要内容,如果未能解决你的问题,请参考以下文章

EXC_BAD_ACCESS 重新加载带有文本字段的单元格

EXC_BAD_ACCESS 在设备上,但在模拟器上很好

BAD_EXC_ACCESS 用于在解除分配时尝试加载视图控制器

EXC_BAD_ACCESS 在多个设备上使用 iCloud

加载 AVPlayer 时出现错误线程 1:EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

在加载文件时捕获EXC_BAD_ACCESS的方法