尝试获取设备位置时 iOS 应用程序崩溃 - 线程 1 : EXC_BAD_ACCESS

标签 ios swift cllocationmanager exc-bad-access clplacemark

我是 iOS 开发的新手,如果这个问题有我不知道的简单解决方法,我很抱歉。

所以我目前正在创建一个需要用户当前位置作为地址的应用程序。

所以在类头中我确保包含 CLLLocationManagerDelegate:

class SignupViewController: UIViewController, CLLocationManagerDelegate  {...}

接下来我为位置管理器创建了一个实例变量:

let locationManager = CLLocationManager()

我还创建了 CLLocationManagerDelegate 函数:

// MARK: CLLocationManagerDelegate functions

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    for location in locations {
        self.getLocationAddress(location)
    }
}

func getLocationAddress(location:CLLocation) -> CLPlacemark? {
    let geocoder = CLGeocoder()
    print("-> Finding user address...")
    var placemark:CLPlacemark!
    geocoder.reverseGeocodeLocation(location, completionHandler: {(placemarks, error)->Void in
        if error == nil && placemarks!.count > 0 {
            placemark = placemarks![0] as CLPlacemark
            print(location)
            if placemark != nil {
                print(CLPlacemark().toString(placemark))
            } else {
                print("Problem with data received from geocoder")
            }
        }
    })
    return placemark
}
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
    print("Error when updating location " + error.localizedDescription)
}

// MARK: Helper functions


func getLocation() {
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestWhenInUseAuthorization()
    locationManager.startUpdatingLocation()
}

我还有一个定义为 CLPlacemark 扩展的 toString 函数:

extension CLPlacemark {
func toString(placemark: CLPlacemark) -> String {
    var addressString : String = ""
    if placemark.ISOcountryCode == "TW" /*Address Format in Chinese*/ {
        if placemark.country != nil {
            addressString = placemark.country!
        }
        if placemark.subAdministrativeArea != nil {
            addressString = addressString + placemark.subAdministrativeArea! + ", "
        }
        if placemark.postalCode != nil {
            addressString = addressString + placemark.postalCode! + " "
        }
        if placemark.locality != nil {
            addressString = addressString + placemark.locality!
        }
        if placemark.thoroughfare != nil {
            addressString = addressString + placemark.thoroughfare!
        }
        if placemark.subThoroughfare != nil {
            addressString = addressString + placemark.subThoroughfare!
        }
    } else {
        if placemark.subThoroughfare != nil {
            addressString = placemark.subThoroughfare! + " "
        }
        if placemark.thoroughfare != nil {
            addressString = addressString + placemark.thoroughfare! + ", "
        }
        if placemark.postalCode != nil {
            addressString = addressString + placemark.postalCode! + " "
        }
        if placemark.locality != nil {
            addressString = addressString + placemark.locality! + ", "
        }
        if placemark.administrativeArea != nil {
            addressString = addressString + placemark.administrativeArea! + " "
        }
        if placemark.country != nil {
            addressString = addressString + placemark.country!
        }
    }
    return addressString
}

当我运行我的代码时,一开始似乎一切正常,这是控制台中的输出:

-> Finding user address...
-> Finding user address...
-> Finding user address...
-> Finding user address...
<+40.10886714,-88.23303354> +/- 10.00m (speed 0.00 mps / course 0.00) @ 5/8/16, 11:34:22 PM Central Daylight Time
401 E John St, 61820 Champaign, IL United States
(lldb)

但是,最后它崩溃并显示 (lldb) 并显示错误 Thread 1: EXC_BAD_ACCESS (code=1, address=0x8) Also it is displaying the error Thread 1: EXC_BAD_ACCESS (code=1, address=0x8)

Console Screenshot

不太确定打印地址后应用崩溃的原因。

在此先感谢您的帮助!

最佳答案

但我不知道哪个能解决这个问题,

而不是将扩展函数调用为

print(CLPlacemark().toString(placemark))

这样调用它,

print(placemark.toString(placemark))

因为存在内存泄漏问题。现在,它没有崩溃。

关于尝试获取设备位置时 iOS 应用程序崩溃 - 线程 1 : EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37107917/

相关文章:

objective-c - 重新加载 Root View Controller

ios - 从 SwiftUI 中的导航栏中删除后退按钮文本

ios - 从解析查询 block 返回 UIImage 数组

ios - 搜索栏搜索时启动指示器

ios - CLLocationmanager - 纬度和经度的小数点

ios - 如何在 iOS 中使用 .frame 属性?

html - ionic 3 : How to Set Background to Transparent in IOS with QR Scanner Plugin?

swift - 在我的购物 list 中添加产品 - 创建购物 list 应用程序

swift - 降低didEnterRegion的阈值

cllocationmanager - Swift 中的 CLLocation Manager 获取用户位置