我在解釋我的原始問題方面做得很差,所以這裏是第二次刺。從上到下的角度來看,這裏的目標是:Objective-C NSMutableString複製
我有一個使用DDXML解析和加載XML映射文件的映射類。這個映射文件有幾個字符串可以顯示給玩家,我將解析並存儲在地圖類中(如NSMutableString *)。當事件觸發將這些消息中的一條加載到播放器時,遊戲循環捕獲NSMutableString *,將其複製到臨時中間對象中,然後當更新將其最終傳遞到其渲染對象時。這看起來很瘋狂,但如果你看到完整的代碼(哈希,我希望!),這會很有意義。
我遇到SEEMS是內存覆蓋的情況......當我嘗試在第二或第三遍(無論是臨時中間人還是渲染對象)中訪問NSMutableString時,紋理座標得到愚蠢。看起來這些字符串本身是完整的,但是附近的內存看起來已經被破壞了。我偶爾會在同一個遊戲循環迭代中得到崩潰(EXC_BAD_ADDR,或類似的),這些讀取在渲染之前完成。
我認爲這幾乎肯定是由於我對NSMutableStrings(仍然)很差的把握。由此,我正在使用可變版本,因爲我需要編輯字符串(例如,添加\ n個字符)。下面是一些相關的代碼片段,可能有助於更好地解釋我在做什麼:
我已經用於渲染一個TextSnippet結構類似於以下(略去了一些數據):
struct TextSnippet
{
NSMutableString* string;
}
我讀出的地圖(DDXML)和文本消息存儲到與所述地圖對象:(MESSAGE->文本被定義爲的NSMutableString *文本[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
什麼內存被覆蓋? –
這些字符串是否需要首先進行修改? –