2016-03-29 5 views
0

経由でインストールしたとき私のものが MKPolyline polylineWithCoordinatesクラッシュXcodeの

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経由でアプリをインストールするとき、それは誰もがそれがある理由を考えることができ

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 

でクラッシュ?

  • 場所はXcodeのをインストール
  • は、私はXcodeで任意のデバッグ/リリースオプションを変更didntはうまく動作しますように存在しない、すべてが、それは別のデバイス上でクラッシュし
  • 標準ですが、唯一のアドホック
  • MapKitは、オープンソースではないので

私は

[MKMultiPoint _wrapAroundTheDateline:count:] 

が何をするか分からないか、なぜそれがcrashe

EDIT 1

は、それはあまりにも多くのスペースををmallocしようとしているMKMultiPointに沸くそこです。

malloc: *** mach_vm_map(size=2405744640) failed (error code=3) 

XCodeの最適化レベルでこれが発生する可能性はありますか?デバッグを実行すると、それが起こっていないので、リリースコードが速度を上げて速度を上げてスピードを上げ、ここで問題を引き起こすのにスペースを利用するのがうんざりです。

私がやっているのは、約1000の座標(多分5キロメートルの実際の長さ)のポリラインを作ることです!

+0

になってしまいました。それはXcodeからの実行と臨時からの実行の大きな違いですので、Xcodeからリリースビルドとして実行することで同じ違いを得ることができますか? – matt

+0

同じ振る舞い、同じクラッシュをしました。 MKPolylineの作成、それに渡されるすべての値は正当です。 – NikkyD

+0

実際にメモリ不足ですか?それはループ本体の周りに自動解放プールを置くのに役立ちますか?新しいアドレスのサニタイザーを使用してみましたか? – matt

答えて

0

これは、デバッグの難しさのもう一つの例です。

犯人は、一つは、そのような配列を割り当てるが動作することを思うだろう

CLLocationCoordinate2D outline[track.lastGeo -track.firstGeo]; 

ました。しかし、何らかの理由で、xcodeのコードオプティマイザがそれを完全に突き詰めました。 ひどく

int count = 0; 

この整数値は、forループと後の間に変化するだろうと。したがってポリラインには狂った大きな整数が与えられ、メモリの制限を超えました。 int constを宣言しても、どうにかしてメモリアドレスが乱雑になり、常に上書きされました。コード最適化のみが有効なので、デバッグではなくリリースビルドスキームでのみ有効です。

MKPolylineの前にNSLog(@"%d", count)を置くことは1つの試みでそれを解決しました。ポリライン後に置く。完全で完全な狂気。

さらにNSUIntegerに対応するためにintをスワップしても役立ちませんでした。

私は、リリースビルドと実行してみてください。この

const NSUInteger size = (track.lastGeo -track.firstGeo +1); 

CLLocationCoordinate2D *outline = calloc(size, sizeof(CLLocationCoordinate2D)); 
関連する問題