iPhone:在循环中创建NSString时出现巨大的内存峰值

iPhone:在循环中创建NSString时出现巨大的内存峰值,iphone,ios,nsstring,automatic-ref-counting,Iphone,Ios,Nsstring,Automatic Ref Counting,我有一个导致崩溃的内存问题。我在字典数组中循环,然后在里面循环我创建的键数组。我使用keys数组中的每个键来获取字典中该键的值。然后通过附加值创建一个字符串。此字符串将包含大量数据 我也在使用ARC,所以我不能手动释放 内存峰值发生在stringByAppendingFormat行上 NSString *theString = [[NSString alloc] init]; for (NSMutableDictionary *aDict in collectionArray) {

我有一个导致崩溃的内存问题。我在字典数组中循环,然后在里面循环我创建的键数组。我使用keys数组中的每个键来获取字典中该键的值。然后通过附加值创建一个字符串。此字符串将包含大量数据

我也在使用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];
    }
}

您应该使用
NSMutableString
,而不是
NSString
。试试这个:

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];
    }
}
编辑:
如果您的字典和
itemKeys
的长度不是特别大,这可能会解决您的问题。但是,如果它们很大,则需要在循环中使用AutoReleS池,就像在这里所做的那样:也可以考虑汤米的更改,如果您所做的只是用逗号分隔这些值。p> 抛开其他地方回答的问题不谈——您不断创建一个新字符串,其中包括旧字符串和一些额外的字符串,将旧字符串保留在自动释放池中,至少在您退出该方法之前,该池不会被排空——如下所示:

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

在没有任何显式内部循环的情况下(如果在末尾添加一个额外的逗号),似乎可以执行您想要的操作。

aDict dictionary和itemKeys数组中有多少条目?您正在泄漏字符串。也许NSMutableString()更适合于此。您可以将appendString与它一起使用。您还可以预先计算中所需的缓冲区容量advance@DanielA.White这不是泄漏,它使用的是ARC.@DanielA.White。我认为它不会泄漏,因为它是一个自动释放的对象。