2012-03-15 6 views
3

クラッシュするメモリの問題があります。私は辞書の配列をループしていて、その中で私が作成したキー配列をループします。そのキー配列の各キーを使用して、そのキーの値を辞書に取得します。次に、値を追加して文字列を作成します。この文字列には大量のデータが含まれます。iPhone:ループでNSStringを作成するときにメモリが膨大になる

私もARCを使用しているため、手動ではリリースできません。

メモリスパイクはstringByAppendingFormat行で発生します。

NSString *theString = [[NSString alloc] init]; 
for (NSMutableDictionary *aDict in collectionArray) 
{ 
    for (NSString *key in itemKeys) 
    { 
     NSString *valueString = [aDict valueForKey:key]; 

     // Memory spikes here 
     theString = [theString stringByAppendingFormat:@"%@,", valueString]; 
    } 
} 
+0

aDict辞書とitemKeys配列にはいくつのエントリがありますか? – ThomasW

+1

あなたは 'theString'を漏らしています。何度も何度も繰り返します。 –

+2

おそらくNSMutableString(https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableString_Class/Reference/Reference.html#//apple_ref/occ/instm/NSMutableString/)これにはもっと適しています。 appendStringを使うことができます。事前に必要なバッファ容量を事前に計算することもできます – Ben

答えて

7

代わりのNSString、あなたはNSMutableStringを使用する必要があります。あなたの辞書とitemKeysの長さは特に大きくない場合、これはおそらくあなたの問題を解決します :

NSMutableString *theString = [[NSMutableString alloc] init]; 
for (NSMutableDictionary *aDict in collectionArray) 
{ 
    for (NSString *key in itemKeys) 
    { 
     NSString *valueString = [aDict valueForKey:key]; 

     // Memory spikes here 
     [theString appendFormat:@"%@,", valueString]; 
    } 
} 

編集:これを試してみてください。しかし、それらが大きい場合は、ここで行うように、あなたのループでオートリアープールを使用する必要があります:https://stackoverflow.com/a/7804798/211292また、トマスの変更はすべてカンマで値を区切っている場合に行ってください。

4

解決済みの問題を別の場所に置く - 古いものといくつかの余分なものを含む新しい文字列を常に作成し、古いものをautoreleaseプールに残します。これは少なくともメソッドを終了するまで排水されません。

NSArray *values = [aDict objectsForKeys:itemKeys notFoundMarker:@""]; 
theString = [values componentsJoinedByString:@","]; 

は、内側のループの明示的な並べ替えなし(まあ、あなたが最後に余分なコンマを追加した場合)あなたがやりたいように思われます。

関連する問題