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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:24:20