Я плохо объяснил свой первоначальный вопрос, так что вот второй удар. С точки зрения сверху вниз, вот цель:
У меня есть класс карты, который использует DDXML для анализа и загрузки файла карты XML. В этом файле карты есть несколько строк для отображения персонажа игроку, которые я анализирую и сохраняю в классе карты (как NSMutableString*). Когда событие инициирует загрузку одного из этих сообщений игроку, игровой цикл захватывает эту NSMutableString*, копирует ее во временный объект посредника, который затем при обновлении передает ее, наконец, в свой объект рендеринга. Это кажется безумием, но в этом есть смысл, если вы видите полный набор кода (ха, надеюсь!).
Я испытываю то, что КАЖЕТСЯ как ситуация с перезаписью памяти ... когда я пытаюсь получить доступ к 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 * на жестко закодированные строковые константы @"" на уровне посредника, проблема с памятью отсутствует. Разве это не должно быть проблемой с тем, как я обрабатываю свои строки здесь?
Еще раз спасибо авторам оригинальных постеров, которые пытались предложить некоторую помощь - я надеюсь, что это более информативно.