2016-03-29 4 views
0

Der folgende Code ausgeführt wird, wenn meine SachenMKPolyline polylineWithCoordinates stürzt auf Ad-hoc aber nicht, wenn über Xcode installiert

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

initialisiert werden und es läuft gut, wenn über Xcode im Einsatz. Aber wenn ich die App über iTunes Ad-hoc-installieren, stürzt es mit

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 

Kann jemand einen Grund denken, warum das so ist?

  • die Standorte existieren als ein mit Xcode installieren läuft ganz gut
  • ich habe nicht alle Debug/Release-Optionen in Xcode ändern, ist alles Standard
  • es auf verschiedenen Geräten abstürzt, aber nur, wenn Ad-hoc-

Da MapKit nicht Open Source ist habe ich keine Ahnung, was

[MKMultiPoint _wrapAroundTheDateline:count:] 

tut oder warum es crashe s gibt

EDIT 1

es auf MKMultiPoint kocht versucht, viel zu viel Raum zu malloc.

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

Ist es möglich, dass die Optimierungsstufe von XCode dies verursacht? Wenn es mit debug ausgeführt wird, passiert es nicht, also vielleicht um den Release-Code zu beschleunigen ist es verpatzt Speicherplatz zu nutzen, um Geschwindigkeit zu gewinnen und somit das Problem hier zu verursachen?!

Alles, was ich mache, ist die Erstellung einer Polylinie mit etwa 1000 Koordinaten (reale Lebensdauer von vielleicht 5 km)!

+0

up Versuchen als Release-Build ausgeführt wird. Das ist der große Unterschied zwischen dem Ausführen von Xcode und dem Ausführen von Ad-hoc. Vielleicht können Sie den gleichen Unterschied erzielen, indem Sie als Release-Build von Xcode ausgeführt werden. – matt

+0

Hat das, das gleiche Verhalten, der gleiche Crash. Erstellung der MKPolyline, alle Werte, die an sie übergeben werden, sind echt. – NikkyD

+0

Haben Sie wirklich keinen Speicher mehr? Hilft es, einen Autorelease-Pool um den Schleifenkörper zu legen? Haben Sie versucht, den neuen Adressdesinfizierer zu verwenden? – matt

Antwort

0

Dies ist ein weiteres perfektes Beispiel dafür, wie schwierig Debugging sein kann.

Der Täter war

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

Man würde denken, dass ein Array zuweisen, wie das funktioniert. Aus irgendeinem Grund hat der Code-Optimierer von xcode das komplett durcheinander gebracht. So schlecht, dass

int count = 0; 

dieser Wert ganze Zahlen während der for-Schleife ändern würde und nach. So erhielt die Polyline eine verrückte große Ganzzahl und überstieg damit das Speicherlimit. Selbst das Erklären der int const half nicht, irgendwie wurde die Speicheradresse durcheinander gebracht und wurde die ganze Zeit überschrieben. NUR mit Code-Optimierungen, also nur mit Release-Build-Schema, nicht mit Debug.

Setzen Sie eine NSLog(@"%d", count) vor der MKPolyline in einem Versuch hat es zu lösen. Putting es nach der Polylinie würde nicht. Vollständiger und völliger Wahnsinn.

Austauschen der int für eine konformere NSUInteger auch nicht geholfen.

landete ich mit diesem

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

CLLocationCoordinate2D *outline = calloc(size, sizeof(CLLocationCoordinate2D));