6

私たちのアプリには、地図と 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 を使用してトラフィック データとイベント データをレンダリングします。以下は、コードのスニペットです。

     [queue addOperationWithBlock:^{ [Set the required data], [Update the UI] }];
    

以下は、マップ機能のランダム操作中に生成される 2 つのクラッシュ ログです。

クラッシュログ - 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
4

1 に答える 1

0

トラフィック イベントが入ってきて、NSOperation に時間がかかっている可能性があると思います。操作が開始され、MapView に存在しなくなったマップ グラフィック要素を参照する可能性があります。たとえば、ユーザーがマップをスクロールしているときに、NSOperation が「キューに入れられ」、ターゲット領域が表示されなくなったときに終了する可能性があります。クラッシュは明らかにメモリ違反です。一般に、コードが解放されたメモリにアクセスしようとしたことが原因です。

NSOperationQueue の使用を検討することをお勧めします。マップのやり取りがよりスムーズになることがわかります。その部分は問題ないかもしれませんが、「イベント」と相まって問題が発生する可能性があります。

クラッシュから、CFRunLoop で実行されており、NSTimer が起動していることがわかります。NSTimer は、Objective C で完全に停止しないことで有名です。NSTimer が最終的に起動すると、それらが処理する要素は一般的に完了し、メモリが解放されます。

于 2014-04-02T03:28:10.707 に答える