2016-05-25 2 views
1

Я знаю, что следующее вызывает утечку памяти, потому что MyClass и myClosure ссылаются друг на друга.Может ли это замыкание вызвать утечку памяти?

var MyClass { 
    var myVar = 0 
    let myClosure: (Int) -> Void 

    init() { 
     self.myClosure = { x in 
      self.myVar = x 
     } 
    } 
} 

Вызывает ли утечка памяти также следующее: Почему или почему нет?

var MyClass { 
    var myVar = 0 

    function myFunc() { 
     let myClosure = { x in 
      self.myVar = x 
     } 

     myClosure(0) 
    } 
} 

ответ

0

Нет, это будет (на практике) не вызывать утечки памяти. myClosure() определяется локально внутри myFunc(). Когда вызывается myClosure(0), закрытие будет запланировано для выполнения, и когда это будет сделано, он будет удален из памяти.

Единственная проблема с вашим кодом заключается в том, что self, внутри вашего закрытия, является сильной ссылкой, которая может быть освобождена к моменту закрытия. Это приведет к плохой избыточной ошибке. Убедитесь, что вы создали слабую ссылку на себя и используете ее в своем закрытии.

+4

Атмана в этом случае не может быть высвобожден, потому что это сильная ссылка. Единственный случай, когда это может привести к неправильному использованию exec, - это когда вы используете незанятое я. – stefos

+1

На самом деле это лучше, потому что освобождение не начнется, пока функция не завершится – Daniel

0

Объявить слабые себя, чтобы избежать утечек памяти и сторожевые себя для того, чтобы избежать вызова высвобождена и настраивает

func myFunc() { 
    let myClosure = { [weak self] x in 
     guard let strongSelf = self else { 
      return 
     } 

     strongSelf.myVar = x 
    } 

    myClosure(0) 
} 
Смежные вопросы