【问题标题】:Parsing NSString substrings gives random EXC BAD ACCESS解析 NSString 子字符串会给出随机 EXC BAD ACCESS
【发布时间】:2014-03-04 17:11:18
【问题描述】:

我正在为 iOS 开发一个简单的 OBJ 解析器,但在组解析方面遇到了问题。我的方法非常原始,因为 OBJ 是针对特定应用程序的:我获取 OBJ 文件的内容并将其按组拆分并解析组特定的字符串。目标是返回每个组的对象或所有组的对象(用户选择)。问题是我这样做时随机获得 EXC BAD ACCESS。起初我以为是我的解析器内存泄漏,所以我用完整的内容做了一个测试,而不是拆分,因为 OBJ 解析器也支持它。也不例外,没什么,它可以工作,即使我做了一百万次(但最终 ipad 内存会融化)。

这里有一些示例代码来显示我的问题所在:

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 BAD ACCESS: - 在解析器内部尝试解释不同级别的 nsstring(可能是索引、名称、顶点等...) - 在完成完全解析当前(数组中的任何内容)nsstring 并返回循环之后 - 解析完所有的nsstrings后,扔进main.m

没有任何细节。我测试了 NSZombie 以检查它是否是一个 dealloc 问题,没有抛出任何东西,尽管我有时会得到“内存读取失败”。有时我会说,因为它完全是随机的,我通常什么也得不到。

一些可能具有重要意义的细节: - 我正在使用 ARC,这是我工作的义务 - 解析相当长~50-200ms,具体取决于 obj 文件大小 - 解析是完全同步的,在这种情况下没有任何事情发生在线程之外 - 内存使用量小,加载完整文件时,调试时没有可见的泄漏 - 你会发现很明显:我是 Objective-c 的初学者

感谢您的宝贵时间!

【问题讨论】:

  • 错误必须在解析器中...
  • 上面的代码乍一看还不错
  • 您是否针对您的项目运行了分析器??
  • (这个错误不是内存泄漏引起的,是僵尸引起的。)
  • 是的,分析器是完全干净的,就像我提到的,我无法通过 NSZombies 检测到任何僵尸。解析器工作正常,因为我可以使用 opengl es 2 将整个文件实例化到 GPU 中。

标签: ios objective-c parsing


【解决方案1】:
NSArray* data = [content componentsSeparatedByString:@"delimiter"];

OBJ 文件真的在字符串“分隔符”上分开吗?或者应该是

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

(我似乎记得 OBJ 以逗号分隔)

【讨论】:

  • 实际上,delimiter 是字符串“g”,因为 OBJ 文件具有由该行标识符组织的组。我只是将“分隔符”作为占位符。所以这意味着这个标识符下的每一行都属于当前组,直到下一个“g”。这工作正常,在调试视图中,数据包含正确的字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 2011-11-29
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
相关资源
最近更新 更多