有关Swift中的内存管理的问题

时间:2018-12-03 10:59:28

标签: ios swift automatic-ref-counting

我刚刚开始学习内存管理,并且有一些疑问。

我正在实现自定义相机

var captureSession = AVCaptureSession()
  1. 我是否需要对此添加一个弱引用(weak var captureSession = AVCaptureSession()),或者一旦我移至另一个未使用上述资源的视图控制器,它会自动释放吗? 我目前正在viewDidDisappear

  2. 中停止captureSession
  3. 在以下任务中添加weak self有什么好处?

    URLSession.shared.dataTask(with: url!) { [weak self](data, response, error) in {
    
    }
    
  4. 我通常向文本字段,网络检查中添加各种观察者 并在viewDidDisappear中将其删除。它们是否已从内存中完全释放,还是我必须在此之上做些额外的事情?

1 个答案:

答案 0 :(得分:1)

1。 AVCaptureSession:

请不要为您的captureSession变量设置弱值,因为不能保证。因为您的captureSession会在不使用时随时释放。另外,我建议您在captureSession函数中停止viewWillDisappear

详细了解弱,强等here

2。 weak self处于屏蔽状态:

当完成块被某些其他对象占据时,应避免使用强引用循环。因此,您应将weak self用于此类完成块。

有关更多信息,请参阅此post

3。观察者:

如果您忘记对班级进行removeObserver,则即使您重新启动同一班级,您的班级也会保留该观察者。

例如: 如果您忘记在ViewController中删除removeObserver,则在重新启动该控制器时,将再次添加您的观察者。这样该观察者方法将被调用两次,依此类推。

但是,如果使用的是ARC,那么删除观察者就足够了,不需要释放textField或其他对象。