gpt4 book ai didi

ios - EXC_BAD_ACCESS 扩展 CLPlacemark 时——在定义范围之外访问的变量

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:22:36 25 4
gpt4 key购买 nike

我有一个问题,我已经找到了解决方法,但我想了解为什么它不起作用——因为它对我来说毫无意义。这是一个演示我的问题的最小示例:

import XCTest
import CoreLocation

class ExampleTests: XCTestCase {

var okay: ext!

// this test works fine
func testOkay(){
okay = ext()
XCTAssertNotNil(okay)
}

// this test crashes with EXC_BAD_ACCESS(code=1, address=0x10)
func testNotOkay(){
let notOkay: ext
notOkay = ext()
XCTAssertNotNil(notOkay)
}
}

extension ExampleTests {
class ext : CLPlacemark{

}
}

我正在阅读一本书以开发一个简单的 TodoList 应用程序,该应用程序使用 CoreLocation 对地址进行地理编码。作为测试的一部分,我必须创建一个模拟 CLPlacemark 对象来测试地理编码功能。

在书中,我被告知我必须为这个模拟声明一个变量作为测试类的属性,否则“测试会崩溃,因为在其定义之外访问了位置标记范围。”

这可以在上面的例子中看到。 testOkay() 工作正常,因为 okay 被声明为类属性。 testNotOkay()EXC_BAD_ACCESS 错误而崩溃,因为我试图在函数中实例化 ext 的新实例。

现在,如果我不扩展 CLPlacemark,问题就消失了——也就是说,我可以在函数中或作为类的属性声明 ext 类型的变量没有问题。

这是怎么回事?我看不出为什么第二个示例会在第一个示例运行时崩溃。在我的实际代码中,当我的模拟地标实例仅在一个或两个函数中使用时,将它们声明为类属性似乎是轻率的。一定是有什么我对 Swift 不了解导致了这个问题。

谢谢!!

最佳答案

我最近在测试需要提供预定义的 CLPlacemark 实例作为输入的功能时遇到了这个问题。经过一些研究,我发现有人对 CLBeacon 类有类似的问题。

EXC_BAD_ACCESS when setting a CLBeacon to nil

Placemark objects are typically generated by a CLGeocoder object, although you can also create them explicitly yourself.

尽管 Apple 文档说您可以自己创建 CLPlacemark 实例。在子类化方面,这个类不是一个好人。它依赖于一个名为 CLPlacemarkInternal 的私有(private)类,当您创建实例时该类为 nil。在下图中,您可以看到此对象在调试器中的外观。 _internal ivar 的值为 0x0,即 nil

screenshot

当您实例化的对象被释放时,发生崩溃并显示 EXC_BAD_ACCESS 消息。无论您是超出范围还是将另一个对象(或 nil)分配给变量。为什么会这样?这是苹果开发者的问题。但您可以在下面找到其他人实现的一些解决方法。

关于ios - EXC_BAD_ACCESS 扩展 CLPlacemark 时——在定义范围之外访问的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41201943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com