结论:本测试主要得出的结果是weak属性是在属性调用deinit or dealloc前被设置nil
1> 验证代码如下(swift)
class WeakTest {
weak var obj: AnyObject?
deinit {
print(obj) /// nil 当前实例对象在deinit完全释放前,weak obj对象就已经被设置nil
print(self)
/// 等deinit完成后,才会使用free释放空间,真正销毁
}
init() {
obj = self
}
}
2> 销毁调用顺序:
- {count = 0}
- {weak = nil}
- {self -> (super) -> 属性} <dealloc deinit> 父类的dealloc会在子类dealloc返回后自动调用
- {解除关联属性 Associate <释放空间>}
- {解除weak属性<不解除,当weak属性为nil时,反找属性设置nil会段错误>}
- free
可以参考一下: dealloc内部原理
3> dealloc deinit 不需要调用super理解
- 对于OC,比较好理解dealloc的调用,但swift还是存在一些疑惑,由于没有[super dealloc],OC可以根据selector在自己的方法列表找,找到就直接调用(不是发消息,消息会递归到父类),但swift没有运行时,那么是不是在编译的时候根据代码有没有deinit就直接绑定函数地址进行调用?
网友评论