我有一个NSMutableArray,里面有很多像这样的行(GPS数据,一小时3600行)
51.040987|12.379154|183|599|0.0|0.0|2014-05-23T17:48:02Z|321.4
在循环中,我将这些值组合成一个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]];
并且我希望将此数据作为xml文件保存在设备上,如此
NSString *fileNameCSV = [NSString stringWithFormat:@"%@/export_%@.csv", documentsDirectory, date2];
success = [csvExport writeToFile:fileNameCSV atomically:YES encoding:NSUTF8StringEncoding error:&error];
数据越少,一切正常,但是当我有大约1500多行时,我会遇到内存问题并且应用程序崩溃,在模拟器中一切正常。
问题不在于保存文件,我认为在组合xml字符串时更多是在for循环中。
还有其他方法可以将数据保存到设备吗?
这里我的代码是autoreleasepool
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]);
}
}
现在应用程序崩溃的数据很少
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
答案 0 :(得分:4)
在autoreleasepool中循环循环,如下所示:
for (...) { // or however you are looping
@autoreleasepool {
// .... everything else
}
}
这将导致一个循环和1500个循环使用相同数量的内存。