使用SFAuthenticationSession遇视图控制器释放加载视图警告问题
解决方案:保持SFAuthenticationSession的引用
这个问题我之前也踩过坑!核心原因是你创建的SFAuthenticationSession是方法内部的局部变量,当connectToReddit方法执行完毕后,ARC(自动引用计数)会立刻释放这个实例。而此时授权弹窗的视图控制器还在尝试加载,就会触发你看到的警告,同时弹窗直接消失。
解决方法很简单,把authSession改成视图控制器的实例属性,让它能在授权流程期间保持存活:
- 首先在
ViewController类中添加一个可选属性来持有授权会话:
class ViewController: UIViewController{ // 添加这个属性,用来持有授权会话 var authSession: SFAuthenticationSession? ///我的其他代码 // ... 你的其他方法 }
- 修改
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
相关产品推荐
相关产品推荐

