调试 CoreGraphics/MapKit 中的崩溃

2024-04-07

当我的应用程序在 iPhone 上运行时,我遇到间歇性崩溃。所有崩溃都是相同的,并且以某种方式涉及 MKMapView Overlays (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 https://github.com/1ndivisible/MKOverlayBug

[电子邮件受保护]:1ndivisible/MKOverlayBug.git http://git@github.com:1ndivisible/MKOverlayBug.git

我不知道如何解决这个问题。这里有我可以使用的信息吗?看来崩溃源于框架的深处。


我认为您的内存不足或者您遇到了 MapKit 中的错误。但在它的辩护中,您似乎没有正确使用覆盖层和 MK 视图,并且跟踪如此多的潜在覆盖层使 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 需要跟踪的大量覆盖以及它可能必须立即显示的 MKView。通过您的示例代码和 iPhone 模拟器的位置模拟器,简单的自行车骑行路线在 MKMapView 中累积了超过 1800 个 MKCircle 和 MKCircleView。

以下是需要记住的几点:

  1. 不要在每个位置添加如此多的叠加层。 1 就足够了。 50 太夸张了。
  2. 每个位置一个 MKCircle 就足够了。不知道为什么 你选择在每次记录并画出如此多的圆圈 地点。
  3. 尝试更有效地将覆盖层移交给 MapView。 只为其提供地图部分所需的叠加层 显示。查看 WWDC2011 视频“第 111 场 - 可视化 使用 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 调用委托方法时所需的覆盖:

- (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];
    }

}

希望这可以帮助。祝你好运!

Tim

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调试 CoreGraphics/MapKit 中的崩溃 的相关文章

  • 玻璃效果 UIView

    我想知道如何在 UIView 上添加玻璃效果 我想像这样的效果 http pttrns com pickers detail 0dc9d9f6c6a7577613b3453768eee3b3在灰色半透明视图上 您 可以在这里看到 Thank
  • ITMS-90535 无法使用最新的 Google Signin SDK 发布 iOS 应用程序

    我正在使用 xcode 7 GM 种子并通过 cocoapods 安装了最新的 Google Signin SDKpod Google SignIn 当我尝试将我的应用程序发布到苹果应用程序商店时 我收到附加错误 Help 以下是 Goog
  • UIView 子类不会自动调整大小

    我一直在寻找有关调整大小的背景信息 但找不到太多 我知道我需要设置autoresizesSubviews在超级视图和autoresizingMask在子视图上 我已经这样做了 并且我的 UIImageViews 正确调整了大小 但我的自定义
  • 如何检测Retina高清显示屏?

    UIScreen有一个新的 nativeScaleiOS 8 中的属性 但文档没有提及它 property nonatomic readonly CGFloat nativeScale 还有一个scale属性 但文档说它是 2 用于视网膜显
  • Objective Flickr 照片上传错误

    我正在使用 ObjectiveFlickr 库将照片从我的 iPhone 应用程序上传到 Flickr 我可以授权该应用程序并执行一般请求 但在尝试上传照片时遇到错误 要上传的照片是使用 AVFoundation 捕获的图像 这是相关代码
  • 在后台任务中安排通知

    我正在为 iOS 开发一个日历 闹钟应用程序 它与网络服务器同步 当在服务器上添加活动时 会发出推送通知 以便 iOS 客户端可以获取新数据 并根据需要更新和安排下一次警报的时间 本地通知 但这仅在应用程序在客户端打开时才有效 我希望客户端
  • UISearchController 保留问题

    我正在尝试使用 UISearchController 但是我遇到了无法解决的保留问题 MainTableview 有两个部分 第1节 基于某些正则表达式过滤数据 第2节 All Data 我将 UISearchController 添加到我
  • 为什么我的 tableView 函数运行了 3 次?

    我有一个 UITableView 并且有执行它所需的方法之一 func tableView tableView UITableView numberOfRowsInSection section Int gt Int println sec
  • 在 Swift 中自动移动 UISlider

    我想在按下按钮时将 UISlider 从 minValue 循环移动到 maxValue 并在再次按下按钮时将其停止在当前位置 我想使用 Swift 我遇到的主要问题是函数 slider setValue 太快了 我希望动画更慢 IBAct
  • 避免“在此块中强烈捕获自身可能会导致保留周期”消息

    每次我必须在块内使用全局变量或属性时 如下所示 self save if isItSaving NO self saveMyFile 我必须像这样重写 BOOL iis isItSaving id myself self self save
  • 如何使用 Swift 获取 YouTube 频道的所有播放列表?

    我的问题不是关于从一般频道检索视频 我只想获取该频道创建的所有 播放列表 并检索每个播放列表的缩略图 标题和视频数量 这是一个 YouTube 频道示例 正如您所看到的 有很多已创建的播放列表 截至目前 我只能获取某个频道最新上传的视频 在
  • 线程 1:信号 SIGABRT - AppDelegate.h

    main m Journey Created by Julian Buscema on 2014 07 13 Copyright c 2014 Julian Buscema All rights reserved import
  • 混合静态和动态 UITableViewController 内容会导致 NSRangeException

    我一直在寻找这个错误 并找到了一些具有类似行为的帖子 但没有解决问题的解决方案 我有一个 UITableViewController 在 SB 中声明为静态 它具有以下部分 第 0 部分 配方 是静态的 有 4 个单元格 第 1 部分 口味
  • iPhone 快照,包括键盘

    我正在寻找拍摄整个 iPhone 屏幕 包括键盘 的正确方法 我找到了一些截取屏幕的代码 CGRect screenCaptureRect UIScreen mainScreen bounds UIView viewWhereYouWant
  • 对于某些纹理尺寸,glFramebufferTexture2D 在 iPhone 上失败

    当我尝试将纹理附加到帧缓冲区时 glCheckFramebufferStatus 报告某些纹理大小的 GL FRAMEBUFFER UNSUPPORTED 我已经在第二代和第四代 iPod Touch 上进行了测试 两个模型之间失败的纹理尺
  • iPhone - 如何在矩形中间绘制文本

    有没有一种方法可以在矩形中间绘制文本 我可以找到各种对齐方式 但我尝试过的任何方法都不能将文本垂直居中在矩形中 有没有一种简单的方法可以做到这一点 或者有什么方法可以将矩形居中然后在其中绘制 我直接绘制到 CGContext 尝试使用 NS
  • iOS WKWebView.scrollView委托导致BAD_ACCESS

    我的 viewController 有一个 UIView 属性 其中包含一个 WKWebView 我将 WKWebView rollView 委托设置为我的 viewController 它是我的 UIView 子类的公共函数 并在我的 v
  • xcode 6.1 (Swift) 中的 SIGABRT 运行时错误

    与最初的代码相比 唯一的更改是在ViewControl swift override func viewDidLoad newMessage hidden true super viewDidLoad Do any additional s
  • 将 CALayer 旋转 90 度?

    如何旋转CALayer90度 我需要旋转所有内容 包括子图层和坐标系 Obj C theLayer transform CATransform3DMakeRotation 90 0 180 0 M PI 0 0 0 0 1 0 Swift
  • 按下表格视图单元格时更改视图?

    我需要帮助 当我的 tableView 的单元格被选择时 我希望该单元格转到它自己的页面 我不希望每个单元格都转到同一页面 我尝试使用 FirstFolderViewController first FirstFolderViewContr

随机推荐

  • XCode 4.4 iOS 5.1 模拟器问题

    我将我的 mac book 更新为 mountain lion 并将 Xcode 更新为 4 4 版本 在之前的版本中 我关闭 iOS 模拟器没有任何问题 并且 Xcode 自动停止构建过程 但现在如果我关闭 iOS 模拟器 Xcode 中
  • Scala:SeqT monad 转换器?

    如果我们有这样的两个函数 def findUserById id Long Future Option User def findAddressByUser user User Future Option Address 然后我们就可以使用
  • “关闭”某物是什么意思?

    我试图理解闭包 但从字面上看every我能找到的闭包定义使用了相同的神秘而模糊的短语 结束 什么是closure 哦 这是一个函数结束另一个功能 但我找不到 结束 的定义 有人能解释一下 A 事物 关闭 B 事物意味着什么吗 闭包是由代码指
  • 如何获取ECS集群的所有日志

    是否有一些 AWS 命令 get 可以从 ECS 集群的所有服务 任务中获取日志 就像是 aws ecs logs cluster dev or aws ecs describe clusters cluster dev logs 例如 必
  • 每周运行一次 php 脚本

    每个星期一我都需要清空 MYSQL 数据库的几个字段 首先 我考虑使用 cron 作业 但我的 Web 托管提供商 fatcow com 既不支持 SSH 也不支持通过命令行访问共享服务器 我还考虑过检查 date 以查看是否是星期一并执行
  • 从不规则时间序列创建规则 15 分钟时间序列

    我的 csv 文件中有一个不规则的时间序列 包含 DateTime 和 RainfallValue C SampleData csv DateTime RainInches 1 6 2000 11 59 0 1 6 2000 23 59 0
  • 树 /f cmd 修改日期。 Windows Powershell

    我需要创建一个 tree驱动器的文件夹 子文件夹和修改日期的列表 tree f命令效果很好 但我需要添加修改日期 我怎样才能做到这一点 它不会那么漂亮 但你可以使用 Recurse使用 Get ChildItem 选项来查找所有这些 此外
  • 是否可以使用 python-shell 包在 Node JS 中安装 python 包?

    我刚刚知道我们可以使用下面的 npm 包在 Node JS 中运行 Python 脚本 蟒蛇外壳 https www npmjs com package python shell 是否可以使用相同的库安装 python 包 就像是pip i
  • 自定义组件上的 OverlayTrigger 不起作用

    我试图在自定义组件 按钮 悬停时显示弹出窗口 class MyComponent extends React PureComponent
  • 如何避免页脚上的手风琴重叠

    我是 jQuery 新手 我正在使用手风琴 当我单击手风琴时 它会重叠在页脚上 我怎样才能避免它 下面是页脚的代码
  • 使用 mmap 访问 PCI-e 内存空间

    我在 Freescale MPC8308 处理器 基于 PowerPC 架构 上使用 PCI e 端口 在尝试使用它时遇到一些问题 端点 PCI e 设备的内存空间等于 256 MB 我可以使用 pciutils 包轻松读取和写入端点设备的
  • wxhaskell异步更新

    我正在使用 WxHaskell 以图形方式显示使用 TCP 通告状态更新的程序的状态 我使用 Data Binary 对其进行解码 当收到更新时 我想更新显示 所以我希望 GUI 能够异步更新其显示 我知道processExecAsync异
  • 如何强制在 DateTimeAxis 上显示特定日期

    是否可以强制在图表上显示网格线以及极端数据点的日期 我已经尝试了以下 Chart DateTimeAxis 属性的几乎所有配置 IntervalType Interval Minimum and Maximum但我对结果并不满意 设置属性M
  • B 树、数据库、顺序插入与随机插入以及速度。随机就是胜利

    EDIT Remus 纠正了我的测试模式 您可以在下面看到他的答案的更正版本 我采纳了用 DECIMAL 29 0 替换 INT 的建议 结果是 十进制 2133GUID 1836 即使行稍大一些 随机插入仍然获胜 尽管有解释表明随机插入比
  • 使用 SFINAE 检测成员函数 [重复]

    这个问题在这里已经有答案了 C 11中 判断一个类是否有成员函数size 您可以定义以下测试助手 template
  • 如何包含 Linux 头文件(如 linux/getcpu.h)?

    我在用着Linux 3 5 0 17 generic 28 Ubuntu SMP Tue Oct 9 19 31 23 UTC 2012 x86 64 GNU Linux 我需要 include
  • 如何在每个“exec”命令处执行 Docker 映像的入口点?

    在尝试使用 Dockerspec 测试 Dockerfiles 后 我终于得到了an issue https github com zuazo dockerspec issues 12我无法正确解决 我认为问题出在 Docker 本身 如果
  • 跨平台 Windows / OS X 开发,具有大量现有代码库

    对于使用 MFC 和 WinAPI 用 C 编写的复杂应用程序 有大量现有代码库 需要将其移植到 Mac OS X 理想的解决方案是在不同平台之间拥有尽可能多的通用代码 尤其是诸如业务之类的代码逻辑 GUI 可能会有所不同 具体取决于跨平台
  • 在 64 位 C++ 程序中使用 32 位库

    有什么方法可以在 64 位系统中使用旧的 32 位静态库 a 吗 没有机会获得这个旧库的源代码来再次编译它 我也不想在 gcc 中使用 m32 因为该程序使用许多 64 位库 谢谢 这完全取决于您运行的平台 例如 PowerPC 上的 OS
  • 调试 CoreGraphics/MapKit 中的崩溃

    当我的应用程序在 iPhone 上运行时 我遇到间歇性崩溃 所有崩溃都是相同的 并且以某种方式涉及 MKMapView Overlays MKCircleViews 来自典型的 iPhone 4s 崩溃报告 报告标题 Hardware Mo