2014-03-04 47 views
0

我正在为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的总初学者

感谢您的时间!

+0

误差必须在解析器......上面 –

+0

的代码看起来好像没什么问题乍一看 –

+0

你有没有运行分析仪对你的项目? –

回答

0
NSArray* data = [content componentsSeparatedByString:@"delimiter"]; 

OBJ文件真的在字符串'delimiter'上分隔吗?或者,这应该是

NSArray* data = [content componentsSeparatedByString:@","]; 

(我似乎记得OBJ分割上逗号)

+0

实际上,分隔符是字符串“g”,因为OBJ文件具有由此行标识符组织的组。我只是把“分隔符”作为占位符。这意味着这个标识符下的每一行都属于当前组,直到下一个“g”。这工作正常,在调试视图中,数据包含正确的字符串。 – Tuxic