我刚刚开始学习内存管理,并且有一些疑问。
我正在实现自定义相机
var captureSession = AVCaptureSession()
我是否需要对此添加一个弱引用(weak var captureSession = AVCaptureSession()
),或者一旦我移至另一个未使用上述资源的视图控制器,它会自动释放吗?
我目前正在viewDidDisappear
在以下任务中添加weak self
有什么好处?
URLSession.shared.dataTask(with: url!) { [weak self](data, response, error) in {
}
我通常向文本字段,网络检查中添加各种观察者
并在viewDidDisappear
中将其删除。它们是否已从内存中完全释放,还是我必须在此之上做些额外的事情?
答案 0 :(得分:1)
1。 AVCaptureSession:
请不要为您的captureSession
变量设置弱值,因为不能保证。因为您的captureSession
会在不使用时随时释放。另外,我建议您在captureSession
函数中停止viewWillDisappear
。
详细了解弱,强等here:
2。 weak self
处于屏蔽状态:
当完成块被某些其他对象占据时,应避免使用强引用循环。因此,您应将weak self
用于此类完成块。
有关更多信息,请参阅此post。
3。观察者:
如果您忘记对班级进行removeObserver
,则即使您重新启动同一班级,您的班级也会保留该观察者。
例如:
如果您忘记在ViewController中删除removeObserver
,则在重新启动该控制器时,将再次添加您的观察者。这样该观察者方法将被调用两次,依此类推。
但是,如果使用的是ARC,那么删除观察者就足够了,不需要释放textField或其他对象。