【问题标题】:GLGeocoder geocodeAddressString crashes SWIFT 3CLGeocoder geocodeAddressString 使 SWIFT 3 崩溃
【发布时间】:2017-02-26 22:44:26
【问题描述】:

为什么我得到一个EXC_BAD_INSTRUCTION,而只是对geocodeAddressString 进行空调用:

geocoder.geocodeAddressString(address, completionHandler: {(placemarks: [CLPlacemark]?, error: NSError?) -> Void in 

} as! CLGeocodeCompletionHandler)

【问题讨论】:

  • 尝试删除 'as! CLGeocodeCompletionHandler',为什么要强制转换?
  • 因为 Swift 编译器一直在代码中进行转换。
  • stackoverflow 中的那个问题没有解决我的问题
  • 那么对于您的问题,您需要提供更多输入

标签: swift3 core-location


【解决方案1】:

您的问题是 error 是 Swift 3 中的 Error? 引用,不再是 NSError?。因此,您的强制施法失败。你可以这样解决:

geocoder.geocodeAddressString(address, completionHandler: {(placemarks: [CLPlacemark]?, error: Error?) -> Void in

} as! CLGeocodeCompletionHandler)

但不需要as! CLGeocodeCompletionHandler。如果它建议强制转换,它可能只是因为它注意到你的闭包类型不正确。

坦率地说,更简单,只需让它推断出正确的类型,您就不必担心这类问题:

geocoder.geocodeAddressString(address) { placemarks, error in 

}

【讨论】:

  • 我以为我也尝试过错误,但是,无论如何你的第二个变种确实有效......谢谢。
  • 确保您在该回调中使用了 [weak self],否则您可能会崩溃。
  • @Gargoyle - 不,如果我们不执行[weak self],它不会崩溃。使用[unowned self] 很容易崩溃,但不仅仅是省略[weak self]。至于你是否使用[weak self],只是你是否需要对相关对象保持强引用的问题。如果只是更新 UI 控件,那么[weak self] 是个好主意。但是如果你也在做其他事情(例如更新模型或持久存储),那么保持强引用可能更合适。这仅取决于您在该闭包中所做的工作。
  • 如果你不使用weak,你会遇到地理编码开始的问题,然后这个人会离开视图控制器。如果你捕捉到对自我的强烈引用,那么你就有一个保留周期,因为 VC 拥有你,你拥有它。
  • 这根本不是真的。它只是一个强参考,但在地理编码调用完成或超时后会立即解决。但这不是一个循环。是的,有时您绝对必须在闭包中使用弱引用以避免强引用循环(当对象本身具有对该闭包的强引用时),但这不是其中一种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多