gpt4 book ai didi

iphone - 在 CoreGraphics/MapKit 中调试崩溃

转载 作者:技术小花猫 更新时间:2023-10-29 11:04:49 28 4
gpt4 key购买 nike

我的应用程序在 iPhone 上运行时出现间歇性崩溃。所有崩溃都是相同的,并且以某种方式涉及 MKMapView 覆盖 (MKCircleViews)。

来自典型的 iPhone 4s 崩溃报告:

报告标题:

Hardware Model:      iPhone4,1
Process: EL-GPS-01 [1021]
Path: /var/mobile/Applications/61288E15-74B5-45B9-99A9-E0B58C767816/EL-GPS-01.app/EL-GPS-01
Identifier: EL-GPS-01
Version: ??? (???)
Code Type: ARM (Native)
Parent Process: launchd [1]

Date/Time: 2011-11-22 15:59:41.065 +0000
OS Version: iPhone OS 5.0.1 (9A405)
Report Version: 104

Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000
Crashed Thread: 6

崩溃的线程:

Thread 6 name: Dispatch queue: com.apple.root.default-priority
Thread 6 Crashed:
0 ??? 0000000000 0 + 0
1 CoreGraphics 0x319a87c2 0x31967000 + 268226
2 CoreGraphics 0x3199a9e6 0x31967000 + 211430
3 MapKit 0x37ec3564 0x37e6f000 + 345444
4 MapKit 0x37ec3652 0x37e6f000 + 345682
5 MapKit 0x37ecc0a4 0x37e6f000 + 381092
6 QuartzCore 0x3341be18 0x33410000 + 48664
7 QuartzCore 0x334d77e0 0x33410000 + 817120
8 QuartzCore 0x3346af24 0x33410000 + 372516
9 libdispatch.dylib 0x3797e892 0x3797b000 + 14482
10 libsystem_c.dylib 0x360e31ca 0x360d9000 + 41418
11 libsystem_c.dylib 0x360e30a0 0x360d9000 + 41120

当我的 iPhone 连接到我的笔记本电脑时应用程序崩溃时,我在输出面板中得到以下信息:

warning: check_safe_call: could not restore current frame
warning: Unable to restore previously selected frame.

调试器什么也没给我,问题导航器显示一个崩溃的线程,堆栈上什么也没有。

这里有一个非常简单的项目突出了问题:

https://github.com/1ndivisible/MKOverlayBug

git@github.com:1ndivisible/MKOverlayBug.git

我不确定如何处理这个问题。这里有我可以使用的信息吗?崩溃似乎起源于框架的深处。

最佳答案

我认为您的内存不足或遇到了 MapKit 中的错误。但是在防御中,您似乎没有正确使用叠加层和 MK View ,并且跟踪如此多的潜在叠加层使 MKMapView 负担过重。举个例子。当您使用以下方法将 50 个叠加层添加到当前位置时:

-(void)addOverlays
{
CLLocation *currentLocation = self.mapView.userLocation.location;

for(int i = 0; i < 50; i++)
{
MKCircle *circle = [MKCircle circleWithCenterCoordinate:currentLocation.coordinate radius:50];
[self.mapView addOverlay:circle];
}
}

随着时间的推移,这可能会增加 MKMapView 需要跟踪的大量叠加层以及它可能必须同时显示的 MKViews。使用您的示例代码和 iPhone 模拟器的位置模拟器,简单的自行车骑行路线在 MKMapView 中累积了超过 1800 个 MKCircle 和 MKCircleViews。

请注意以下几点:

  1. 不要为每个位置添加太多叠加层。 1个就够了。 50 有点矫枉过正。
  2. 每个位置一个 MKCircle 应该足够了。不知道为什么您选择跟踪并在每个位置绘制这么多圆圈地点。
  3. 尝试更高效地将叠加层移交给 MapView。只为它所在的 map 部分提供它所需的叠加层显示。查看 WWDC2011 视频“第 111 节 - 可视化Information Geographically with MapKit”展示了如何优化这个或 HazardMap 示例代码。

你可以按照这些思路做一些事情:

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
// Add it to an NSArray that you use to keep track of ALL the overlays
[self.allOverlays addObject: MKCircle *circle = [MKCircle circleWithCenterCoordinate:currentLocation.coordinate radius:50]];

// Now add it to the mapView if it is in the current region

// code to check to see if currentLocation is within the current map region

if (overlayIsInMapRegion){
[mapView addOverlay: circle];
}
}

然后每当区域发生变化时,计算 MapView 调用委托(delegate)方法时所需的叠加层:

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated

从 mapView 中获取区域并创建位于该区域的叠加层数组。类似的东西:

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
// Create a method that takes the region and calculates which overlays it contains
NSArray *newOverlays=[self overlaysForRegion: mapView.region fromAllOverlays: self.allOverlays];
if ([newOverlays count]>0){
[mapView removeOverlays];
[mapView addOverlays: newOverlays];
}

}

希望这对您有所帮助。祝你好运!

蒂姆

关于iphone - 在 CoreGraphics/MapKit 中调试崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8266950/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com