初始化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
相关产品推荐
相关产品推荐

