加载数据 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(仅限设备)的主要内容,如果未能解决你的问题,请参考以下文章
BAD_EXC_ACCESS 用于在解除分配时尝试加载视图控制器
EXC_BAD_ACCESS 在多个设备上使用 iCloud