Swift运行简单async函数触发Thread 1: EXC_BAD_ACCESS报错
崩溃原因排查
你触发的Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)崩溃和代码业务逻辑无关,核心是执行环境没有等待异步任务完成就提前终止进程:
MyFunc()中创建的Task是独立调度的异步任务,MyFunc()本身在启动Task、执行完同步方法third()后就会立刻返回,不会等待内部Task执行结束。- 如果你是在Swift命令行工程(Command Line Tool)中直接运行这段顶层代码,主线程执行完最后一行
MyFunc()调用后会直接退出进程、回收全部内存。此时还在睡眠等待的异步任务访问已被释放的空内存地址,就会触发空指针崩溃。 - 额外提醒:原代码缺少
Foundation模块导入,Task.sleep是Foundation提供的系统API,不导入会直接编译失败。
修复方法
根据运行场景选择对应方案即可:
命令行运行场景
需要显式让主线程等待异步任务执行完成后再退出,参考可运行代码:
import Foundation func first() async throws { try await Task.sleep(nanoseconds: 100) print("Potato") } func second() async throws { try await Task.sleep(nanoseconds: 1) print("Apple") } func third(){ print("Cherry") } func MyFunc() { Task { print("Banana") try await first() try await second() print("Onion") } third() } // 用@main标记异步入口,自动等待异步逻辑执行 @main struct App { static func main() async throws { MyFunc() // 预留足够时间让内部异步任务执行完成,生产环境建议用TaskGroup、信号量做精确等待 try await Task.sleep(nanoseconds: 1_000_000_000) } }
代码正常运行的输出顺序为:
Cherry Banana Apple Potato Onion
注:
third()是同步调用,会在Task启动后立即执行,因此最先打印Cherry,这是Swift并发的正常调度逻辑,不属于错误。
iOS/macOS应用场景
如果是在App生命周期内(比如ViewController、SwiftUI视图的生命周期方法中)调用MyFunc(),应用主线程不会随意终止,只要导入Foundation模块即可正常运行,不会触发该崩溃。
内容的提问来源于stack exchange,提问作者checkm8
相关产品推荐
相关产品推荐

