这个循环非常慢,我想因为我创建了很多中间字符串。我怎样才能加快速度?

时间:2009-09-08 23:58:05

标签: iphone objective-c cocoa-touch

NSArray *splitPoints = [routeGeom componentsSeparatedByString:@"], ["];
routePoints = malloc(sizeof(CLLocationCoordinate2D) * ([splitPoints count] + 1));

int i=0;
NSArray *coords; 
for (NSString* coordStr in splitPoints) {

  coords = [coordStr componentsSeparatedByString:@","];

  routePoints[i].latitude = [[[coords objectAtIndex:0] substringFromIndex:1]floatValue];
  routePoints[i].longitude = [[coords objectAtIndex:1] floatValue];

  i++;

}
[coords release];

NSLog(@"** Time to split the route geometry into structs %f", [NSDate timeIntervalSinceReferenceDate] - start);

4 个答案:

答案 0 :(得分:6)

考虑:

char *buf = [coordStr UTF8String];
sscanf(buf, "%f,%f", &routePoints[i].latitude, routePoints[i].longitude);

答案 1 :(得分:2)

我会考虑使用[coordStr UTF8String]返回的c-string并手动解析字符。

答案 2 :(得分:2)

在我看来,NSScanner就是一个胜利的案例。 -componentsSeparatedByString和-substringFromIndex都将创建堆对象,这是您不希望在紧密循环中执行的操作。

答案 3 :(得分:2)

我只是想我会跳到这里并说你的行[coords release]是不必要的(而且是错误的)。您应该将其删除以避免在非GC环境中出现问题。您不必释放coords,因为您没有明确创建或保留它。