我从苹果文档或swift书籍中得到了这个
当实例被取消初始化时,您仍然可以访问属性,并可以根据需要对其进行操作在这个例子完全消失之前。
我很困惑,他们的意思是,例如,当我们使用deinit()
方法中的instance属性进行一些数学运算时?或者说,当我们打印string
类型的属性时,该属性是特定实例的一部分,也是来自deinit
()方法?如果是,那么deinit()
方法是在属性被取消初始化时操作该属性的唯一方法吗?
如果你有一个swift类,它有一个var,你知道你必须在之后清理,因为ARC无法释放它(例如C内存),你仍然可以在deinit中这样做。存储在属性中的指针仍然有效!
不过,它对更多的事情没有用处(好吧,用通知中心或kvo结束观察),因为无法保证何时调用deist。只是在解除分配之前调用它[无论何时]
deinit
在解除分配之前(retainCount达到0时)被调用,因此您的所有属性仍然有效,并且您可以打印字符串。您不需要在deinit
中将属性显式设置为nil,因为这是自动发生的。
话虽如此,大多数类甚至不需要deinit
实现的
大多数时候,我使用deinit
来删除实例注册到的observer,在需要时发布任何通知,等等。
据我所知,deinit
方法在实例被取消初始化之前被调用,为您提供了执行任何需要执行的操作(清理、关闭文件、终止网络连接等)的最后机会。
文档中说,在调用deinit
时,您的对象尚未被解除初始化(但很快就会被解除初始化),因此您仍然可以(最后一次)访问其属性。