我解释原来的问题做得不好,所以这是第二次尝试。从上到下的角度来看,这是目标:
我有一个使用DDXML解析和加载XML映射文件的map类。这个映射文件有几个字符串供字符显示给播放器,我正在解析并存储在地图类中(作为NSMutableString *)。当事件触发将其中一条消息加载到播放器时,游戏循环会抓取NSMutableString *,将其复制到临时中间人对象中,然后当更新最终将其传递到其渲染对象时。这看起来很疯狂,但如果你看到完整的代码集会很有意义(哈,我希望!)。
我正在经历SEEMS作为内存覆盖情况......当我尝试在第二次或第三次传递中访问NSMutableString时(无论是临时中间人还是渲染对象),纹理坐标得到高飞。看起来这些琴弦本身就完好无损,但附近的记忆看起来很明显。我偶尔会在同一个游戏循环迭代中遇到崩溃(EXC_BAD_ADDR或类似事件),这些渲染在渲染之前完成。
我认为这几乎可以肯定是由于我(仍然)对NSMutableStrings的掌握不足。顺便说一下,我正在使用可变版本,因为我需要在加载后编辑字符串(例如添加\ n字符)。以下是一些相关的代码片段,可能有助于更好地解释我正在做的事情:
我有一个用于渲染的TextSnippet结构,看起来类似于以下内容(为简洁起见省略了一些数据):
struct TextSnippet
{
NSMutableString* string;
}
我读取地图(DDXML)并将文本消息存储到地图对象中:( message-> text定义为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 *数据更改为中间层的硬编码@“”字符串常量时,内存问题就不存在了。它不仅仅是我在这里处理我的字符串的问题吗?
再次感谢那些试图提供帮助的原创海报 - 我希望这会提供更多信息。
答案 0 :(得分:0)
我不知道你为什么会收到这个错误(我从未有过这个错误),但是你的示例代码中有些内容看起来很奇怪(可能只是我缺乏C / C ++知识: - )< / p>
message->text[i++] = [[NSMutableString alloc]
initWithString:[[text attributeForName:@"text"] stringValue]];
我在SDK中找不到对stringValue
方法的任何引用。但除此之外,为什么不直接存储对正在创建的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]]];
因为它会通过复制[m_message->text[m_currentText]]
中的文字来创建新的NSMutableString。
随意告诉我,我说的是垃圾,因为你可能比我更了解混合C / C ++和Objective C: - )