MKPolyline polylineWithCoordinates在ad hoc上崩溃,但在通过xcode安装时崩溃

时间:2016-03-29 17:52:00

标签: ios xcode mapkit

以下代码在我的资源初始化时运行

CLLocationCoordinate2D outline[track.lastGeo -track.firstGeo];

CLLocationCoordinate2D upper = ((CLLocation*)track.locations[track.firstGeo]).coordinate;
CLLocationCoordinate2D lower = ((CLLocation*)track.locations[track.firstGeo]).coordinate;

int count = 0;
for (int i = track.firstGeo; i <= track.lastGeo; i++) {

    CLLocation *firstLoc = [track.locations objectAtIndex:i];

    outline[count++] = firstLoc.coordinate;

    if([firstLoc coordinate].latitude > upper.latitude) upper.latitude = [firstLoc coordinate].latitude;
    if([firstLoc coordinate].latitude < lower.latitude) lower.latitude = [firstLoc coordinate].latitude;
    if([firstLoc coordinate].longitude > upper.longitude) upper.longitude = [firstLoc coordinate].longitude;
    if([firstLoc coordinate].longitude < lower.longitude) lower.longitude = [firstLoc coordinate].longitude;
}

_outline = [MKPolyline polylineWithCoordinates:outline count:count -1];

通过xcode部署时运行正常。 但是,当我通过itunes ad hoc安装应用程序时,它会崩溃

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x40480b3508f648cf
Triggered by Thread:  0

Filtered syslog:
None found

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   MapKit                          0x000000018de19484 -[MKMultiPoint _wrapAroundTheDateline:count:] + 108
1   MapKit                          0x000000018de195d8 -[MKMultiPoint _setCoordinates:count:] + 184
2   MapKit                          0x000000018de195d8 -[MKMultiPoint _setCoordinates:count:] + 184
3   MapKit                          0x000000018de13a74 +[MKPolyline polylineWithCoordinates:count:] + 84

任何人都可以想到为什么会这样吗?

  • 这些位置确实存在,因为xcode运行得很好
  • 我没有更改xcode中的任何调试/发布选项,都是标准的
  • 它在不同设备上崩溃,但仅限于临时

因为MapKit不是开源的,所以我不知道是什么

[MKMultiPoint _wrapAroundTheDateline:count:]

为什么会崩溃

编辑1

归结为MKMultiPoint尝试使用太多的空间。

 malloc: *** mach_vm_map(size=2405744640) failed (error code=3)

XCode的优化级别是否可能导致这种情况?当运行调试时它没有发生,所以也许为了加快发布代码的速度,利用空间来提高速度,从而导致问题在这里?!

我正在做的是创建一个大约有1000个坐标的折线(实际长度可能是5公里)!

1 个答案:

答案 0 :(得分:0)

这是调试有多困难的另一个完美例子。

罪魁祸首是

CLLocationCoordinate2D outline[track.lastGeo -track.firstGeo];

有人会认为分配这样的数组是有效的。但是,出于某种原因,xcode的代码优化器完全搞砸了。 非常糟糕

int count = 0;

这个整数值会在for循环期间和之后发生变化。因此,Polyline被赋予了一个疯狂的大整数,因此超出了内存限制。 即使声明int const也没有帮助,不知何故记忆地址被搞砸了并且一直被覆盖。只有代码优化,所以只有发布版本方案,而不是调试。

在MKPolyline之前设置NSLog(@"%d", count)一次尝试解决它。把它放在折线后不会。完全疯狂。

int换成更合规的NSUInteger也无济于事。

我最终得到了这个

const NSUInteger size = (track.lastGeo -track.firstGeo +1);

CLLocationCoordinate2D *outline = calloc(size, sizeof(CLLocationCoordinate2D));