1

我在解释我最初的问题方面做得很差,所以这是第二次刺伤。从自上而下的角度来看,目标如下:

我有一个使用 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* 数据更改为硬编码的 @"" 字符串常量时,就不存在内存问题。我在这里如何处理我的字符串难道不是一个问题吗?

再次感谢那些试图提供一些帮助的原始海报 - 我希望这能提供更多信息。

4

1 回答 1

0

我不知道您为什么会收到此错误(我从来没有遇到过),但是您的示例代码中有一些看起来很奇怪(可能只是我缺乏 C/C++ 知识:-)

message->text[i++] = [[NSMutableString alloc] 
                        initWithString:[[text attributeForName:@"text"] stringValue]];

stringValue我在 SDK 中找不到对方法的任何引用。但除此之外,为什么不存储对正在创建的 NSMutableString 的引用呢?我也不确定是什么text,但假设 `[text attributeForName:@"text"]' 返回一个 NSString,我认为您无论如何都不需要获取 stringValue。

m_msgText->string = [[NSMutableString alloc] 
                        initWithString:[m_message->text[m_currentText] mutableCopy]];

我不确定你为什么要这么做[m_message->text[m_currentText] mutableCopy]。为什么不只是做

 m_msgText->string = [[NSMutableString alloc] 
                        initWithString:[m_message->text[m_currentText]]];

因为它会通过复制文本来创建一个新的 NSMutableString [m_message->text[m_currentText]]

随意告诉我我在说垃圾,因为你可能比我更了解混合 C/C++ 和 Objective C :-)

于 2011-07-08T00:36:02.210 回答