我想在视图控制器的生命周期结束时执行一些清理,即删除NSNotificationCenter通知.dealloc在Swift编译器错误中实现结果:
Cannot override 'dealloc' which has been marked unavailable
Run Code Online (Sandbox Code Playgroud)
在Swift中对象生命结束时执行某些清理的首选方法是什么?
Kyl*_*egg 323
deinit {
// perform the deinitialization
}
Run Code Online (Sandbox Code Playgroud)
来自Swift文档:
在取消分配类实例之前立即调用deinitializer.您使用deinit关键字编写deinitializers,类似于使用init关键字编写初始化器的方式.Deinitializers仅适用于班级类型.
通常,在取消分配实例时,您无需执行手动清理.但是,当您使用自己的资源时,可能需要自己执行一些额外的清理.例如,如果创建自定义类以打开文件并向其写入一些数据,则可能需要在取消分配类实例之前关闭该文件.
Jam*_*mes 43
deinit {
// perform the deinitialization
}
Run Code Online (Sandbox Code Playgroud)
是Swift"dealloc"的正确答案.
但是,最好在iOS 9中指出NSNotificationCenter不再需要清理!
NSNotificationCenter
在OS X 10.11和iOS 9.0中,NSNotificationCenter和NSDistributedNotificationCenter将不再向可能已解除分配的已注册观察者发送通知.如果观察者能够存储为归零弱引用,则底层存储将把观察者存储为归零弱引用,或者如果对象不能被弱存储(即它具有可以阻止运行时的自定义保留/释放机制)从能够弱对象存储对象,它将对象存储为非弱的归零引用.这意味着观察者不需要在他们的释放方法中取消注册.将被路由到该观察者的下一个通知将检测归零的引用并自动取消注册观察者.如果一个对象可以被弱引用,则在重新分配期间将不再向观察者发送通知; 在非弱调零参考观察者的情况下,在dealloc期间接收通知的先前行为仍然存在.基于块的观察者通过 - [NSNotificationCenter addObserverForName:object:queue:usingBlock]方法仍然需要在不再使用时取消注册,因为系统仍然拥有对这些观察者的强引用.仍然支持过早删除观察者(弱引用或引用归零).CFNotificationCenterAddObserver不符合此行为,因为观察者可能不是对象.
但请注意下面关于强引用的要点,所以你可能不得不担心清理......?
小智 20
当不再需要实例时,Swift会自动释放您的实例,以释放资源.Swift通过自动引用计数(ARC)处理实例的内存管理,如自动引用计数中所述.通常,在取消分配实例时,您无需执行手动清理.但是,当您使用自己的资源时,可能需要自己执行一些额外的清理.例如,如果创建自定义类以打开文件并向其写入一些数据,则可能需要在取消分配类实例之前关闭该文件.
类定义每个类最多可以有一个deinitializer.deinitializer不接受任何参数,并且没有括号写入:
deinit {
// perform the deinitialization
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
63490 次 |
| 最近记录: |