【发布时间】:2011-07-07 23:55:49
【问题描述】:
我在解释我最初的问题时做得很糟糕,所以这里是第二个刺。从自上而下的角度来看,目标如下:
我有一个使用 DDXML 解析和加载 XML 地图文件的地图类。这个地图文件有几个字符串供一个字符显示给玩家,我正在解析并存储在地图类中(作为 NSMutableString*)。当一个事件触发将其中一条消息加载给玩家时,游戏循环会抓取该 NSMutableString*,将其复制到一个临时的中间人对象中,然后在更新时最终将其传递给它的渲染对象。看起来很疯狂,但是如果你看到完整的代码集就会很有意义(哈,我希望!)。
我遇到了似乎是内存覆盖的情况......当我尝试在第二次或第三次传递中访问 NSMutableString 时(临时中间人或渲染对象),纹理坐标得到傻傻的。似乎琴弦本身完好无损,但附近的记忆似乎已被淹没。在渲染之前完成这些读取的同一个游戏循环迭代中,我偶尔会遇到崩溃(EXC_BAD_ADDR 或类似情况)。
我认为这几乎可以肯定是由于我(仍然)对 NSMutableStrings 的掌握不佳。顺便说一句,我正在使用可变版本,因为我需要在加载字符串后编辑字符串(例如添加 \n 字符)。这里有一些相关的代码 sn-ps 可能有助于更好地解释我在做什么:
我有一个用于渲染的 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* 数据更改为硬编码的 @"" 字符串常量时,内存问题就不存在了。我在这里处理字符串的方式难道不是一个问题吗?
再次感谢试图提供帮助的原始发帖者 - 我希望这能提供更多信息。
【问题讨论】:
-
你提到的这个 NSMutableArray 在哪里?为什么要在结构中的数组中存储对象而不是仅使用 NSArray?
-
什么内存被覆盖了?
-
这些字符串首先需要是可变的吗?
-
Chuck,很好 - Array 评论是一个错字。我已经编辑了原始问题以反映。这里只是字符串。大多数功能代码都是在 C++ 中完成的,与平台无关,所以我尽量避免使用 Objective-C 类。也就是说,我必须使用 NSStrings(最好是 Mutables,因为我在这里或那里做了一些小的编辑)。被覆盖的内存在几个地方,但在这种情况下,它位于纹理坐标中,与我们复制到(而不是从)的字符串存储在相同的结构中。
标签: objective-c nsstring nsmutablestring