我正在编写一个iOS 5应用程序,可以实时跟踪用户的位置,在MKMapView
上绘制他们的课程。无论何时进行GPS读取,我都希望在当前位置和旧位置之间绘制折线,最终形成用户所走过的轨道(或面包屑)。
我很乐意使用MKPolyline
和MKPolylineView
来绘制轨道,假设我预先拥有所有CLLocationCoordinate2D
坐标,使用类似下面的代码:
MKPolyline *route = [MKPolyline polylineWithCoordinates:coordinates count:[self.coordinateArray count]];
[mapView addOverlay:route];
但是,由于我只是实时获取CLLocationCoordinate2D
坐标(因为调用了locationManager:didUpdateToLocation:fromLocation:
委托方法),我不确定绘制新折线的最佳方法。
我可以扩展现有的行(即添加到基于C的coordinates
数组 - 没有太多的C经验我不确定如何做到这一点)或者我是否需要在接下来的两行之间创建新的折线坐标(虽然我听说地图上有太多单独的折线会影响性能和内存使用......)?
提前致谢。
答案 0 :(得分:5)
首先,请参阅how to update MKPolyline / MKPolylineView?,尤其是Breadcrumb示例代码的链接。这可能是您需要的良好起点。
但是,您会发现其CrumbPath
对象的重要部分是对realloc
的调用。所以是的,如果想要有效地存储点数组,你需要知道如何管理C风格的数组。是的,这并不容易。是的,C风格的数组操作是内存泄漏的邀请。
Breadcrumb示例使用realloc
来调整其数组的大小。通过为NSMutableData
类型分配数组使用的内存,您可以更安全一些。建议作为Is it ok to use “classic” malloc()/free() in Objective-C/iPhone apps?的答案。阅读其他解决方案,了解常规C malloc()
和free()
函数执行相同的工作。请注意,NSMutableData有一个非常方便的increaseLengthBy:
方法。
当您理解为什么每个C学生都试图错误地使用sizeof()
时 - 以及如何正确使用它 - 您将理解C内存管理。