打破 Swift 结构体中的循环引用
在 Swift 中,「类」(class) 类型会被分配在堆 (heap) 中,并使用引用计数来追踪它的生命周期,并在它被销毁的时候从堆中移除。而「结构体」(struct) 则不需要在堆中分配额外的内存空间,也不使用引用计数器机制,同时也就没有了销毁的步骤。
是吧?
事实上,「堆」、「引用计数」、「清除行为」 这些也适用于「结构体」类型。不过要当心:不适当的行为容易引发问题,接下来我将会向你展示你可能会怎样把「结构体」当成「类」来使用的结果,并告诉你为什么会导致内存泄漏、错误行为和编译器错误。
警告:这篇文章使用了一些 反模式(你千万不要真的去这么干),我这么做是为了突出结构体在使用闭包时一些不容易被注意到的风险,避免危险的最好方式就是掌握好它们,除非你了解风险后还能怡然自得。
目录: