You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

初始化Storyboard后调用ViewController方法触发EXEC_BAD_ACCESS问题

单元测试调用ViewController方法触发EXEC_BAD_ACCESS错误问题

我正在为ViewController编写单元测试,初始化代码如下:

var sut: viewController!

override func setUp() {
    super.setUp()
    let storyboard = UIStoryboard(name: "storyBoardName", bundle: nil)
    sut = storyboard.instantiateViewController(withIdentifier: "storyboard_identifier") as? viewController
    sut.loadViewIfNeeded() // 加载视图层级
}

Storyboard已正确初始化,包含文本标签且默认关联不为空,但调用ViewController类中的任意方法时会触发EXEC_BAD_ACCESS错误:

func testVC() {
    XCTAssertNotNil(sut) // 此断言通过,且能看到属性已被赋予默认值
    viewController.configure() // 此方法触发EXEC_BAD_ACCESS,尽管它是一个非私有方法
}

问题排查与解决方案

  • 核心错误:调用方法时使用了错误的实例
    测试代码中直接用viewController.configure()调用实例方法是错误的——实例方法必须绑定到具体的实例对象上,正确写法应该使用初始化好的sut实例:sut.configure(),这大概率是触发错误的直接原因。

  • 类名大小写规范问题
    Swift类名首字母大写是标准规范,你的代码中viewController为小写,可能导致类型转换或实例识别异常。建议将类名改为ViewController,变量声明同步修正:

    var sut: ViewController!
    
  • 确保Storyboard实例化的类型转换正确
    虽然XCTAssertNotNil(sut)通过,但as? viewController的可选转换可能隐藏类型不匹配问题。可以改用强制转换并添加断言,确保实例化的类型正确:

    sut = storyboard.instantiateViewController(withIdentifier: "storyboard_identifier") as! ViewController
    XCTAssertNotNil(sut, "无法从Storyboard实例化ViewController")
    
  • 检查configure()方法内部逻辑
    如果上述修正后仍报错,排查configure()方法中是否存在野指针访问:比如是否访问了未正确初始化的IBOutlet(单元测试环境下视图加载逻辑可能有差异)、已释放的对象,或者越界访问数组等内存操作。


修正后的测试代码示例

var sut: ViewController!

override func setUp() {
    super.setUp()
    let storyboard = UIStoryboard(name: "storyBoardName", bundle: nil)
    sut = storyboard.instantiateViewController(withIdentifier: "storyboard_identifier") as! ViewController
    sut.loadViewIfNeeded()
}

func testVC() {
    XCTAssertNotNil(sut)
    sut.configure()
    // 可添加断言验证configure方法的执行效果,例如检查标签文本是否正确设置
    // XCTAssertEqual(sut.titleLabel.text, "预期文本")
}

内容的提问来源于stack exchange,提问作者sample-user

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 03:37:53