为何普通函数初始化weak变量会触发释放告警,@MainActor函数却不会?
普通函数给weak变量赋值告警,@MainActor函数却不告警的原因
先搞懂weak的本质:被weak修饰的变量不会对对象产生强引用,只要没有其他强引用"抓着"这个对象,它会立刻被ARC回收。
- 在普通的
bar()函数里,你新建了UIViewController()实例,直接赋值给weak var test。这时候这个控制器没有任何其他强引用,ARC会马上把它销毁——编译器一眼就看穿了这个操作没用,所以触发告警提示你。 - 但标记了
@MainActor的fooBar()函数就不一样:UIKit的所有组件(比如UIViewController)都是绑定到MainActor的,必须在主线程创建和操作。当你在@MainActor函数里创建控制器时,编译器知道这个对象在正确的上下文里,而且UIKit框架在主线程的runloop周期内,会对刚创建的UI对象有隐式的临时强引用(比如保证它能活到当前runloop迭代结束),所以编译器判断这个对象不会立刻被回收,也就不会弹出告警了。
补充一点:哪怕在@MainActor函数里,要是这个控制器没被加到视图层级或者其他强引用链里,最终还是会被回收,但编译器的静态分析不会再揪着"立即释放"的问题告警,因为它默认MainActor上下文里的UI对象至少能撑过当前的runloop循环。
内容的提问来源于stack exchange,提问作者Andrey Mosin
相关产品推荐
相关产品推荐

