周日晚上,看到Vong在文章《聊聊最近遇到的一个Crash》中表示遇到了一个Swift特有的Crash,最后只解决了问题,没有找到根本原因。我就把他拉到了最近刚组的Swift老炮交流群里面,想着这个问题还蛮有意思的,估计会有不少人感兴趣。果然,最后炸出了不少潜水的群友。经过一番讨论之后,最后
Cyandev发现了原因。因为在讨论过程中发现了几个有意思的东西,所以想写一篇简短的笔记,来大家分享一下。
问题描述我先简单描述一下问题,问题发生于下面这种写法,在运行时会直接crash:
classManager:NSObject{deinit{_=String(format:"%p",self)}}classViewController:UIViewController{overridefuncviewDidLoad(){super.viewDidLoad()let_=Manager()}}
如果我们把它改成OC的写法,则不会发生Crash:
interfaceManager:NSObjectendimplementationManager-(void)dealloc{NSString*ret=[NSStringstringWithFormat:"%",self];}endinterfaceViewController()endimplementationViewController-(void)viewDidLoad{[superviewDidLoad];Manager*manager=[[Manageralloc]init];}end解决问题解决Crash最快捷的方式就是查看堆栈,崩溃堆栈如下:
Thread1Queue: