我在解释我最初的问题方面做得很差,所以这是第二次刺伤。从自上而下的角度来看,目标如下:
我有一个使用 DDXML 解析和加载 XML 地图文件的地图类。这个地图文件有几个字符串供一个字符显示给玩家,我正在解析并存储在地图类中(作为 NSMutableString*)。当一个事件触发将其中一条消息加载给玩家时,游戏循环会抓取该 NSMutableString*,将其复制到一个临时的中间人对象中,然后在更新时最终将其传递给它的渲染对象。看起来很疯狂,但是如果你看到完整的代码集就会很有意义(哈,我希望!)。
我正在经历似乎是内存覆盖的情况......当我尝试在第二遍或第三遍(临时中间人或渲染对象)中访问 NSMutableString 时,纹理坐标变得愚蠢。似乎琴弦本身完好无损,但附近的记忆似乎已被淹没。我偶尔会在相同的游戏循环迭代中遇到崩溃(EXC_BAD_ADDR 或类似情况),这些读取是在渲染之前完成的。
我认为这几乎可以肯定是由于我(仍然)对 NSMutableStrings 的掌握不佳。顺便说一句,我正在使用可变版本,因为我需要在加载字符串后编辑字符串(例如添加 \n 字符)。以下是一些相关的代码片段,可能有助于更好地解释我在做什么:
我有一个用于呈现的 TextSnippet 结构,看起来类似于以下内容(为简洁起见,省略了一些数据):
struct TextSnippet
{
NSMutableString* string;
}
我阅读地图(DDXML)并将文本消息存储到地图对象中:(message->text is defined as NSMutableString* text[MAX_TEXT_PER_MESSAGE];
message->text[i] = [NSMutableString stringWithCapacity:50];
[message->text[i] setString:[[text attributeForName:@"text"] stringValue]];
[message->text[i] retain];
然后我执行以下操作(注意:这可能真的很愚蠢和错误,我很肯定我正在泄漏内存,就像没人管我的事,但我只是在快速尝试更糟糕的想法,这是最糟糕的最新想法):
这是中间人层:
// Properly copy the NSMutableString into the local message
for (int i = 0; i < m_message->count; i++)
{
m_message->text[i] = [message->text[i] mutableCopy];
[message->text[i] retain];
}
最后,在循环的后面,我实际上写入了 TextSnippet 结构(在本例中为 m_msgText),因此可以呈现文本:
m_msgText->string = [m_message->text[m_currentText] mutableCopy];
[m_msgText->string retain];
就像我说的,我知道做额外的副本有点讨厌......我正在研究其他更广泛的重写来解决这个问题,但在此期间......你应该怎么做,如果你是否需要传递 NSMutableString* 这么多?我想问题仍然可能是其他问题,但是每当我在中间人层将 NSMutableString* 数据更改为硬编码的 @"" 字符串常量时,就不存在内存问题。我在这里如何处理我的字符串难道不是一个问题吗?
再次感谢那些试图提供一些帮助的原始海报 - 我希望这能提供更多信息。