以下代码在我的资源初始化时运行
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
任何人都可以想到为什么会这样吗?
因为MapKit不是开源的,所以我不知道是什么
[MKMultiPoint _wrapAroundTheDateline:count:]
为什么会崩溃
编辑1
归结为MKMultiPoint尝试使用太多的空间。
malloc: *** mach_vm_map(size=2405744640) failed (error code=3)
XCode的优化级别是否可能导致这种情况?当运行调试时它没有发生,所以也许为了加快发布代码的速度,利用空间来提高速度,从而导致问题在这里?!
我正在做的是创建一个大约有1000个坐标的折线(实际长度可能是5公里)!
答案 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));