Iphone 应用程序在iOS 7上因使用MKAnnotation、CGBitmapContextCreate和NSOperationQueue开发的地图功能而崩溃

Iphone 应用程序在iOS 7上因使用MKAnnotation、CGBitmapContextCreate和NSOperationQueue开发的地图功能而崩溃,iphone,objective-c,cocoa-touch,ios7,Iphone,Objective C,Cocoa Touch,Ios7,我们的应用程序具有基于地图和GPS的位置跟踪功能。此应用程序已上载到Apple Store。该应用程序包含以下功能: 地图显示实时交通数据显示实时交通事件(事故、交通堵塞等) 用户的GPS定位跟踪 对于iOS版本5和6,应用程序运行良好。 在应用程序中操作地图功能时,我们面临iOS 7测试版的以下崩溃问题。我们使用iOS的以下功能在地图上呈现交通数据和交通事件: MKAnnotation以呈现交通事件 为了呈现流量数据,应用程序正在使用CGBitmapContextCreate函数 conte

我们的应用程序具有基于地图和GPS的位置跟踪功能。此应用程序已上载到Apple Store。该应用程序包含以下功能:

  • 地图显示实时交通数据显示实时交通事件(事故、交通堵塞等)
  • 用户的GPS定位跟踪 对于iOS版本5和6,应用程序运行良好。 在应用程序中操作地图功能时,我们面临iOS 7测试版的以下崩溃问题。我们使用iOS的以下功能在地图上呈现交通数据和交通事件:

  • MKAnnotation以呈现交通事件

  • 为了呈现流量数据,应用程序正在使用CGBitmapContextCreate函数

    context = CGBitmapContextCreate (NULL,
                                    self.mapView.frame.size.width,                                                    
                                    self.mapView.frame.size.height, 
                                    8,// bits per component
                                    bitmapBytesPerRow,
                                    colorSpace,
                                    kCGImageAlphaPremultipliedLast);
    
    CGContextSetAllowsAntialiasing (context,YES)
    
  • 绘制线条以在位图上下文上显示流量数据

  • 创建的位图上下文将使用MKAnnotation API显示在地图上

  • 应用程序使用NSOperationQueue呈现流量和事件数据,因为用户与map的交互是平滑的。以下是代码片段:

     [queue addOperationWithBlock:^{ [Set the required data], [Update the UI] }];
    
下面是在随机操作映射功能时生成的两个崩溃日志

崩溃日志-1

事故

Identifier: 471EAE21-E118-4E3D-AAAE-D7D82B1D6326

CrashReporter

Key:

bdbf75eb30240449214769478f38830aa7a14f7f

Hardware

Model:      iPhone5,2

Process:             {Application Name} [246]

Path:                /var/mobile/Applications/4FA0A7F2-4998-4F8F-A4C6-66D849D074B8/{Application Name}.app/{Application Name}

Identifier:          {Application bunald name}

Version:             X.X.X.X

Code

Type:           ARM (Native)

Parent

Process:      launchd [1]

Date/Time:           2013-08-30 14:21:24.523 +0530

OS

Version:          iOS 7.0 (11A4449d)

Report

Version:      104

Exception

Type:  EXC_BAD_ACCESS (SIGSEGV)

Exception

Subtype: KERN_INVALID_ADDRESS at 0x8000000c

Triggered

by Thread:  0

Thread

0 Crashed:

0   libobjc.A.dylib                 0x38ed3b66

objc_msgSend + 6

1   CoreFoundation                              0x2ede773c -[__NSSetM removeObject:] + 92

2   MapKit                              0x3002de96 -[MKAnnotationManager

_removeRepresentationForAnnotation:fromCull:] + 490

3   MapKit                              0x3004bc54 -[MKAnnotationManager

_removeAnnotation:updateVisible:removeFromContainer:] + 272

4   MapKit                              0x3004bb38 -[MKAnnotationManager removeAnnotation:] + 24

5   SLIM                                  0x00165828 -[TravelStarViewController

mapView:viewForAnnotation:] (TravelStarViewController.m:1735)

6   MapKit                              0x3005ea86 -[MKMapView

annotationManager:representationForAnnotation:] + 74

7   MapKit                              0x3002a136 -[MKAnnotationManager _addRepresentationForAnnotation:]

+ 362

8   MapKit                              0x30028c4a -[MKAnnotationManager updateVisibleAnnotations] +

1034

9   Foundation                      0x2f876358 __NSFireTimer + 60

10  CoreFoundation                            0x2ee7ae84 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__

+ 12

11  CoreFoundation                            0x2ee7aa9e __CFRunLoopDoTimer + 790

12  CoreFoundation                            0x2ee78e26 __CFRunLoopRun + 1214

13  CoreFoundation                            0x2ede353c CFRunLoopRunSpecific + 520

14  CoreFoundation                            0x2ede331e CFRunLoopRunInMode + 102

15  GraphicsServices                           0x3387733e

GSEventRunModal + 134

16  UIKit                                 0x313fc7b0 UIApplicationMain + 1132

17  SLIM                                 0x000f3fa6

main (main.m:15)

18  SLIM                                 0x000f3efc start + 36

我想这可能是因为交通事件即将发生,并且需要很长时间才能实施。该操作可以启动,然后引用MapView中不再存在的地图图形元素。例如,用户可以滚动地图,操作可以“排队”,然后在目标区域不可见时结束。这次崩溃显然是内存冲突。通常由试图访问已释放内存的代码引起

我建议您研究一下NSOperationQueue的使用。我可以看到它将如何使地图交互更加平滑,这一部分可能还可以,但加上“事件”可能会导致问题


从崩溃中,我可以看到它运行在一个CFRunLoop上,一个NSTimer正在启动。NSTimer因在目标C中没有完全停止而臭名昭著。当它们最终启动时,它们所使用的元素通常都会完成并释放它们的内存。

您解决了这个问题吗?我得到了这个错误。