在Swift中释放

我想在视图控制器的生命周期结束时执行一些清理,即删除NSNotificationCenter通知。 实现dealloc导致Swift编译器错误:

 Cannot override 'dealloc' which has been marked unavailable 

在Swift的对象生命周期结束时执行一些清理的首选方法是什么?

 deinit { // perform the deinitialization } 

从Swift文档 :

在解除分配类实例之前立即调用取消初始化程序。 你可以使用deinit关键字来编写deinitializers,类似于init关键字的初始化函数。 取消初始化器仅适用于类types。

通常,当您的实例被释放时,您不需要执行手动清理。 但是,当您使用自己的资源时,可能需要自行执行一些额外的清理。 例如,如果您创build自定义类来打开文件并向其中写入一些数据,则可能需要在释放类实例之前closures该文件。

 deinit { // perform the deinitialization } 

是Swift“dealloc”的正确答案。

不过,在iOS 9中指出新的NSNotificationCenter不再需要清理!

https://developer.apple.com/library/content/releasenotes/Foundation/RN-FoundationOlderNotes/index.html#X10_11Notes

NSNotificationCenter

在OS X 10.11和iOS 9.0中,NSNotificationCenter和NSDistributedNotificationCenter将不再向可能被释放的注册观察者发送通知。 如果观察者能够被存储为零弱引用,则底层存储将把观察者存储为一个归零弱引用,或者如果对象不能被弱存储(即,它具有定制的保留/释放机制,这将阻止运行时从弱存储对象)它将存储该对象作为一个非弱的归零引用。 这意味着观察员不需要取消注册方式。 下一个将被发送给该观察者的通知将检测归零参考并自动取消注册观察者。 如果一个对象可以被弱引用,那么在释放期间通知将不再被发送给观察者; 先前在dealloc期间接收通知的行为仍然存在于非弱调零参考观察者的情况下。 通过 – [NSNotificationCenter addObserverForName:object:queue:usingBlock]方法的基于块的观察者仍然需要在不再使用时被注册,因为系统仍然对这些观察者持有强烈的引用。 过早地移除观察者(弱引用或归零引用)仍然受支持。 CFNotificationCenterAddObserver不符合此行为,因为观察者可能不是一个对象。

但请注意下面强烈的引用点,所以你可能不得不担心清理呢?

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Deinitialization.html

Swift在不再需要的时候自动释放你的实例,释放资源。 Swift通过自动引用计数(ARC)处理实例的内存pipe理,如自动引用计数中所述。 通常,当您的实例被释放时,您不需要执行手动清理。 但是,当您使用自己的资源时,可能需要自行执行一些额外的清理。 例如,如果您创build自定义类来打开文件并向其中写入一些数据,则可能需要在释放类实例之前closures该文件。

类定义每个类最多可以有一个deinitializer。 取消初始化程序不采取任何参数,并写入括号:

  deinit { // perform the deinitialization }