1

在我的应用程序中,我正在地图上绘制折线叠加层,点从didUpdateUserLocation:委托方法获得的用户位置开始。

但由于某种原因,它总是从非洲开始。

可能是什么原因?我是否必须为折线指定任何起始坐标?

-(void)drawTheRoute{
    [self.mapViewTrace removeOverlay:self.polyline];
    CLLocationCoordinate2D coordinates[arrayOfPoint.count];
    int i = 1;
    for (TMPoint *point in arrayOfPoint) {
        coordinates[i] = point.coordinate;
        i++;
    }


    MKPolyline *polyline = [MKPolyline polylineWithCoordinates:coordinates count:arrayOfPoint.count];
    [self.mapViewTrace addOverlay:polyline];

    self.polyline = polyline;

    self.lineRenderer = [[MKPolylineRenderer alloc] initWithPolyline:self.polyline];
    self.lineRenderer.strokeColor = [UIColor redColor];
    self.lineRenderer.lineWidth = 5;

}

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
        TMPoint *point = [[TMPoint alloc] initWithCoordinate:userLocation.location.coordinate withSpeed:userLocation.location.speed];
        [arrayOfPoint addObject:point];
        [self drawTheRoute];
}
4

1 回答 1

0

在该drawTheRoute方法中,使用元素coordinates声明C 数组,循环使用索引变量初始化 C 数组的每个索引。arrayOfPoint.countfori

问题是i索引变量最初设置为 1 而不是 0。

C 数组(和NSArrays)的第一个索引是索引 0,而不是 1。

这使得 的第一个坐标coordinates未初始化,并且内存恰好包含被解释为坐标 0、0(有时是“随机”坐标)的值。

(另一个效果是,当arrayOfPoint只有一个对象时,C 数组将只有一个索引为 0 的元素。但由于i初始化为 1,for循环最终将设置 C 数组的索引 1(第二个元素)即使只分配了一个内存元素并且您将访问未分配给您的内存,这可能导致 EXC_BAD_ACCESS。)

更改此行:

int i = 1;

对此:

int i = 0;
于 2014-08-05T12:36:00.760 回答