2016-05-25 22 views
1

MyClassmyClosureが互いに参照するため、次のようにメモリリークが発生することがわかります。このクロージャがメモリリークを引き起こしますか?

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) 
} 
関連する問題