2011-07-07 30 views
1

我在解釋我的原始問題方面做得很差,所以這裏是第二次刺。從上到下的角度來看,這裏的目標是: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 *數據更改爲硬編碼的@「」字符串常量時,內存問題就不存在。這不就是因爲我如何在這裏處理我的琴絃嗎?

再次感謝那些試圖提供一些幫助的原創海報 - 我希望這會提供更多信息。

+1

這是哪裏的NSMutableArray你提到?爲什麼你將對象存儲在一個數組中而不是僅僅使用NSArray? – Chuck

+1

什麼內存被覆蓋? –

+0

這些字符串是否需要首先進行修改? –

回答

0

我不知道爲什麼你會得到這個錯誤(我從來沒有過),但是你的示例代碼中有一些看起來很奇怪(可能只是我缺乏C/C++知識:-)

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

我無法在SDK中找到對stringValue方法的任何引用。但除此之外,爲什麼不直接存儲對正在創建的NSMutableString的引用呢?我也不確定text是什麼,但假設`[text attributeForName:@「text」]'返回一個NSString,我不認爲你需要獲取stringValue。我不知道你爲什麼要做[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的比我好:-)

+0

您可以將最後一位縮減爲'm_msgText-> string = [m_message-> text [m_currentText] mutableCopy];'。 '-stringValue'可能會返回一個不可變的字符串,所以同樣的東西適用於那裏。 –

+0

德里克和格奧爾格,我打賭你是對的......我不知道那裏的行爲與NSMutableString複製,所以這將工作,我認爲。讓我做更多的挖掘,我會很快發佈我的結果。 – David

+0

Derek和Georg,我重寫了我的問題......我希望這能更好地解釋我正在努力完成的事情。我整天都在做一堆修補工作,但我仍然沒有多少運氣。任何想法將不勝感激! – David