如何在快速编程中解决这个EXC_BAD_ACCESS(code = EXC_i386_GPFLT)

这是我的code.getting这个EXC_BAD_ACCESS(code = EXC_i386_GPFLT)。我不知道如何find并解决PLZ帮助我…应用程序获取经度崩溃时,获取经度

mapServerRequest="Hyderabad,india" var mapAddress:NSString=mapServerRequest mapAddress.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLPathAllowedCharacterSet()) println(mapAddress) var urlpath=NSString(format: "http://maps.googleapis.com/maps/api/geocode/json?address=%@", mapAddress) println(urlpath) var url = NSURL.URLWithString(urlpath) println(url) var jsonData:NSData=NSData(contentsOfURL:url) if(jsonData != nil) { var error:NSError=NSError(coder: nil) var result:NSDictionary=NSJSONSerialization .JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary //println(result) if (error != nil) { mapServerResultArray=result.valueForKey("results") as NSMutableArray // println(mapServerResultArray) } var longitud:NSString longitud=mapServerResultArray.objectAtIndex(0).valueForKey("geometry").valueForKey("location").valueForKey("lng")as NSString var latitud :NSString = (mapServerResultArray .objectAtIndex(0).valueForKey("geometry").valueForKey("location").valueForKey("lat")) as NSString placeName=mapServerResultArray .objectAtIndex(0).valueForKey("formatted_address") as NSString var longitude:Float=longitud.floatValue var latitude:Float=latitud.floatValue self.zoomMapAndCenterAtLatitude(latitude) self.zoomMapAndCenterAtLongitud(longitude) 

这里的问题是,你正在执行的大部分操作都可以返回nil,如果你尝试使用它作为非零值,将会导致Swift崩溃。 你需要明确的testing零。 大锤的做法是

 let mapAddress = "Hyderabad,india" let url = NSURL.URLWithString("http://maps.googleapis.com/maps/api/geocode/json?address=\(mapAddress)") let jsonData = NSData(contentsOfURL:url) var latitude = NSNumber(double: 0.0) var longitude = NSNumber(double: 0.0) var success = false if jsonData != nil { if let result = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil) as? NSDictionary { if let mapServerResultArray = result.valueForKey("results") as? NSArray { if let geometry = mapServerResultArray[0].valueForKey("geometry") as? NSDictionary { if let location = geometry.valueForKey("location") as? NSDictionary { if let lat = location.valueForKey("lat") as? Float { latitude = lat if let lng = location.valueForKey("lng") as? Float { longitude = lng success = true } } } } } } } if success { println("Latitude = \(latitude), longitude=\(longitude)") } else { println("Failed") } 

…但这是丑陋的。 由于这个例程可能找不到任何关键字,所以最后你可能有或没有一对有效的坐标。 这正是Optionals所要求的。 考虑重写它作为一个函数,返回一个可选的:

 struct Coordinate { // Or use any of Cocoa's similar structs var latitude: Double var longitude: Double } func getCoordsOf(#address: String) -> Coordinate? { let url = NSURL.URLWithString("http://maps.googleapis.com/maps/api/geocode/json?address=\(address)") let jsonData = NSData(contentsOfURL:url) if jsonData == nil { return nil } let result = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary if result == nil { return nil } if let geometry = result.valueForKey("results").valueForKey("geometry") as? NSArray { if geometry.count > 0 { let lat = geometry[0].valueForKey("location")?.valueForKey("lat")?.doubleValue let lng = geometry[0].valueForKey("location")?.valueForKey("lng")?.doubleValue if (lat != nil) && (lng != nil) { return Coordinate(latitude: lat!, longitude: lng!) } } } return nil } if let coord = getCoordsOf(address: "Hyderabad,india") { // ... do something } 

这使用可选的链接( ? )来减lesstesting,但是我们必须在geometry上打破它,因为我们需要它作为一个数组,因为我们需要访问它的特定元素(当然,应该testing它是不是是一个空arrays!)

ps – 具有讽刺意味的是,你的error != niltesting什么都不做,因为你没有发送error的JSONObjectWithData例程。

在这种情况下,您可以将纬度转换为string。 更新的代码:

  mapServerRequest="Hyderabad,india" var mapAddress:NSString=mapServerRequest mapAddress.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLPathAllowedCharacterSet()) println(mapAddress) var urlpath=NSString(format: "http://maps.googleapis.com/maps/api/geocode/json?address=%@", mapAddress) println(urlpath) var url = NSURL.URLWithString(urlpath) println(url) var jsonData:NSData=NSData(contentsOfURL:url) if(jsonData != nil) { var error:NSError=NSError(coder: nil) var result:NSDictionary=NSJSONSerialization .JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary //println(result) if (error != nil) { mapServerResultArray=result.valueForKey("results") as NSMutableArray // println(mapServerResultArray) } var longitud:NSString longitud=NSString(format:mapServerResultArray.objectAtIndex(0).valueForKey("geometry").valueForKey("location").valueForKey("lng")) var latitud :NSString latitud=NSString(format:(mapServerResultArray .objectAtIndex(0).valueForKey("geometry").valueForKey("location").valueForKey("lat"))) placeName=NSString(format:mapServerResultArray .objectAtIndex(0).valueForKey("formatted_address")) var longitude:Float=longitud.floatValue var latitude:Float=latitud.floatValue self.zoomMapAndCenterAtLatitude(latitude) self.zoomMapAndCenterAtLongitud(longitude) 

简短的回答:

在该scheme中启用僵尸,并启用一个断点,并在日志中显示正确的原因

技术原因:

你正试图做一些在架构中不允许的东西请参考这个exception代码“EXC_I386_GPFLT”的含义是什么?

您收到的回复是:“ http://maps.googleapis.com/maps/api/geocode/json?address=Hyderabad,india

你可以像下面这样获取:

这里jsondict是你从api的反应

 NSArray *results = [jsonDict objectForKey:@"results"]; NSDictionary *geometry = [[results objectAtIndex:0] valueForKey:@"geometry"]; NSArray *location = [geometry objectForKey:@"location"]; float lat = [[location valueForKey:@"lat"] floatValue]; float lng = [[location valueForKey:@"lng"] floatValue]; 

用这个 :

 var longitud:NSString =(mapServerResultArray.objectAtIndex(0).valueForKey("geometry").objectForKey("location").valueForKey("lng")) as NSString var latitud :NSString = (mapServerResultArray .objectAtIndex(0).valueForKey("geometry").objectForKey("location").valueForKey("lat")) as NSString placeName=mapServerResultArray .objectAtIndex(0).valueForKey("formatted_address") as NSString var longitude:Float=longitud.floatValue var latitude:Float=latitud.floatValue self.zoomMapAndCenterAtLatitude(latitude) self.zoomMapAndCenterAtLongitud(longitude)