我正在为iOS设计一个简单的OBJ解析器,而且我一直在遇到组解析的问题。由于OBJ是针对特定应用程序的,因此我的方法非常简单:我获取OBJ文件的内容并按组拆分它并解析组特定的字符串。目标是为每个组返回一个对象或所有组的对象(用户选择)。问题是我在做这件事时随机得到了EXC BAD ACCESS。起初我认为这是我的解析器中的内存泄漏,所以我对全部内容进行了测试,而不是分割,因为OBJ解析器也支持它。没有例外,没有什么,它的工作原理,即使我做了一百万次(最终ipad内存虽然融化了)。解析NSString子串给出了随机的EXC BAD ACCESS
下面是一些示例代码显示在我的问题是:
NSString* path = [[NSBundle mainBundle] pathForResource:@"file"
ofType:@"obj"];
NSString* content = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:NULL];
// works
for (int i = 0; i < 100; i++) {
[parser parse:content];
}
NSArray* data = [content componentsSeparatedByString:@"delimiter"];
// not working - random EXC BAD ACCESS
for(NSString* obj in data)
{
[parser parse:obj]; // doing a for loop with an index is the same
}
// works, even though it's pointless
for(NSString* obj in data)
{
[parser parse:content];
}
所以,当解析器试图解析OBJ抛出EXC错误访问相当随意地在这些地方的部分: - 解析器内尝试时在不同层次上解释nsstring(可能是索引,名称,顶点等...) - 完成后完全解析当前(从数组中取出)nsstring并返回到循环 - 解析完所有nsstrings,扔在main.m
没有任何细节。我测试NSZombie来检查它是否是一个dealloc问题,没有抛出,虽然我有时会得到“内存读取失败”。有时候我会说,因为它是完全随机的,我通常什么也得不到。
可能有其重要性的一些细节: - 我使用ARC,这是对我的工作 的义务 - 解析相当长〜50-200ms根据OBJ文件大小 - 解析是完全同步的,没有什么完成关闭线程在这种情况下 - 内存使用量小,并加载完整的文件,有上调试 没有明显的泄漏 - 你会发现它很明显:我在Objective-C的总初学者
感谢您的时间!
误差必须在解析器......上面 –
的代码看起来好像没什么问题乍一看 –
你有没有运行分析仪对你的项目? –