iOS NSMutableArray到NSString,然后保存到设备>&燃气轮机&燃气轮机;内存不足

iOS NSMutableArray到NSString,然后保存到设备>&燃气轮机&燃气轮机;内存不足,ios,iphone,memory,nsstring,nsmutablearray,Ios,Iphone,Memory,Nsstring,Nsmutablearray,我有一个NSMutableArray,里面有很多这样的行(GPS数据,一小时3600行) 在一个循环中,我将这些值组合成一个xml字符串 像这样 xmlExport = [NSString stringWithFormat:@"%@\t\t<trackpoint>\n\t\t\t<latitude>%@</latitude>\n\t\t\t<longitude>%@</longitude>\n\t\t\t<altitudemete

我有一个NSMutableArray,里面有很多这样的行(GPS数据,一小时3600行)

在一个循环中,我将这些值组合成一个xml字符串

像这样

xmlExport = [NSString stringWithFormat:@"%@\t\t<trackpoint>\n\t\t\t<latitude>%@</latitude>\n\t\t\t<longitude>%@</longitude>\n\t\t\t<altitudemeter>%@</altitudemeter>\n\t\t\t<altitudefeet>%@</altitudefeet>\n\t\t\t<speedkmh>%@</speedkmh>\n\t\t\t<speedmph>%@</speedmph>\n\t\t\t<datetime>%@</datetime>\n\t\t\t<degree>%@</degree>\n\t\t</trackpoint>\n", xmlExport,[CoordsArray objectAtIndex: 0], [CoordsArray objectAtIndex: 1], [CoordsArray objectAtIndex: 2], [CoordsArray objectAtIndex: 3], [CoordsArray objectAtIndex: 4], [CoordsArray objectAtIndex: 5], [CoordsArray objectAtIndex: 6], [CoordsArray objectAtIndex: 7]];
数据越少,一切正常,但当我有大约/超过1500行时,我的内存出现问题,应用程序崩溃,在模拟器中一切正常

问题不在于保存文件,我认为在组合xml字符串时,它更多地处于for循环中

是否有其他方法将数据保存到设备

这里是我的代码和自动释放池

    for (NSString *line in coords) {

    @autoreleasepool {

        NSArray* CoordsArray = [line componentsSeparatedByString:@"|"];

        if(ExportType2==2){
            xmlExport = [NSString stringWithFormat:@"%@\t\t<trackpoint>\n\t\t\t<latitude>%@</latitude>\n\t\t\t<longitude>%@</longitude>\n\t\t\t<altitudemeter>%@</altitudemeter>\n\t\t\t<altitudefeet>%@</altitudefeet>\n\t\t\t<speedkmh>%@</speedkmh>\n\t\t\t<speedmph>%@</speedmph>\n\t\t\t<datetime>%@</datetime>\n\t\t\t<degree>%@</degree>\n\t\t</trackpoint>\n", xmlExport,[CoordsArray objectAtIndex: 0], [CoordsArray objectAtIndex: 1], [CoordsArray objectAtIndex: 2], [CoordsArray objectAtIndex: 3], [CoordsArray objectAtIndex: 4], [CoordsArray objectAtIndex: 5], [CoordsArray objectAtIndex: 6], [CoordsArray objectAtIndex: 7]];
        }

        if(ExportType2==3){
            kmlExport = [NSString stringWithFormat:@"%@,%@,%@,%@", kmlExport,[CoordsArray objectAtIndex: 1], [CoordsArray objectAtIndex: 0], [CoordsArray objectAtIndex: 2]];
        }

        if(ExportType2==4){
            gpxExport = [NSString stringWithFormat:@"%@\t\t<trkpt lat=\"%@\" lon=\"%@\">\n\t\t\t<ele>%@</ele>\n\t\t\t<time>%@</time>\n\t\t\t<magvar>%@</magvar>\n\t\t</trkpt>\n", gpxExport,[CoordsArray objectAtIndex: 0], [CoordsArray objectAtIndex: 1], [CoordsArray objectAtIndex: 2], [CoordsArray objectAtIndex: 6], [CoordsArray objectAtIndex: 7]];
        }

        //NSLog([NSString stringWithFormat:@"line: %@", line]);
        //NSLog([NSString stringWithFormat:@"gpxExport: %@", gpxExport]);

    }
}
在autoreleasepool中包装循环的内部,如下所示:

for (...) { // or however you are looping
    @autoreleasepool {
        // .... everything else
    }
}
这将导致一个循环和1500个循环使用相同的内存量。

在autoreleasepool中包装循环的内部,如下所示:

for (...) { // or however you are looping
    @autoreleasepool {
        // .... everything else
    }
}

这将导致一个循环和1500个循环使用相同的内存量。

您还可以使用
-[NSMutableString appendFormat:…]
,这在维护基本格式的同时会有很大帮助。更好的做法是将数据逐行写入文件,这样可以将内存使用量减少到几乎为零。显示您的代码
@autoreleasepool{}
可能就是您所需要的。我已经编辑了我的帖子,并插入了您在Instruments中对此进行分析时使用的代码,您看到了什么?您确实分析了这一点,对吗?我应该在这里粘贴什么?您还可以使用
-[NSMutableString appendFormat:…]
,这在维护基本格式的同时会有很大帮助。更好的做法是将数据逐行写入文件,这样可以将内存使用量减少到几乎为零。显示您的代码
@autoreleasepool{}
可能就是您所需要的。我已经编辑了我的帖子,并插入了您在Instruments中对此进行分析时使用的代码,您看到了什么?您确实分析了这个,对吗?我应该粘贴在这里的乐器的内容仍然会使用至少两倍的内存,因为他的基本格式是
string=[NSString stringWithFormat:@“%@,…”,string]
,所以至少他有旧字符串和新字符串。这会有所帮助,但并非在所有情况下都足够。实际上,最好的方法是逐行写出来。它仍然会使用至少两倍的内存,因为他的基本格式是
string=[NSString stringWithFormat:@“%@,…,string]
,所以至少他有旧字符串和新字符串。这会有所帮助,但并非在所有情况下都足够。实际上,最好的方法是逐行写出来。
self    Class   MailBuilder 0x00115f58
coords  __NSArrayM *    @"29 objects"   0x15e5e960
line    __NSCFString *  @"51.041037|12.379055|0|0|0.0|0.0|2014-05-23T18:29:17Z|297.6"   0x15e497f0
CoordsArray __NSArrayM *    @"8 objects"    0x17dde2a0
xmlExport   NSString *  0x17d39a00  0x17d39a00
for (...) { // or however you are looping
    @autoreleasepool {
        // .... everything else
    }
}