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

使用SFAuthenticationSession遇视图控制器释放加载视图警告问题

解决方案:保持SFAuthenticationSession的引用

这个问题我之前也踩过坑!核心原因是你创建的SFAuthenticationSession是方法内部的局部变量,当connectToReddit方法执行完毕后,ARC(自动引用计数)会立刻释放这个实例。而此时授权弹窗的视图控制器还在尝试加载,就会触发你看到的警告,同时弹窗直接消失。

解决方法很简单,把authSession改成视图控制器的实例属性,让它能在授权流程期间保持存活:

  1. 首先在ViewController类中添加一个可选属性来持有授权会话:
class ViewController: UIViewController{
    // 添加这个属性,用来持有授权会话
    var authSession: SFAuthenticationSession?
    ///我的其他代码
    
    // ... 你的其他方法
}
  1. 修改connectToReddit方法,把局部的authSession赋值给这个属性,同时注意避免循环引用:
@IBAction func connectToReddit(){
    // 先安全解包URL,避免强制解包导致崩溃
    guard let authURL = URL(string: "https://www.reddit.com/api/v1/authorize?client_id=myID&response_type=code&state=myState&redirect_uri=myRedirectURI&duration=permanent&scope=myscopes") else {
        print("创建授权URL失败")
        return
    }
    let scheme = "redditwatch://"
    
    // 赋值给实例属性,同时用[weak self]打破循环引用
    authSession = SFAuthenticationSession(url: authURL, callbackURLScheme: scheme, completionHandler: { [weak self] (url, error) in
        // 授权完成后,记得把属性置空,及时释放内存
        self?.authSession = nil
        
        print(url?.absoluteString)
        print(error?.localizedDescription)
    })
    
    authSession?.start()
}

补充说明:

  • 为什么要加[weak self]?因为SFAuthenticationSession的completionHandler会持有会话实例,而会话实例又持有视图控制器,不加weak的话会形成循环引用,导致视图控制器无法被正常释放。
  • 授权完成后手动置空authSession是为了及时释放内存,避免不必要的资源占用。

这样修改后,授权弹窗就能正常保持到用户完成操作,那个烦人的警告也会消失啦!

内容的提问来源于stack exchange,提问作者Will

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:00:46