2017-04-26 6 views
1

私はブロックをパラメータとして受け入れる関数を持っています。末尾のクロージャを使用してコードブロックを渡すことはできますが、クロージャはselfを保持するときにweak参照を使用する必要があります。関数パラメータ型を使用して弱参照を避けますか?

例えば、MyClass2の初期化を参照してください。

class MyClass { 
    func subscribe(using block: @escaping() -> Void) { 
     DispatchQueue.global().async { 
      block() 
     } 
    } 
} 

let test = MyClass() 

class MyClass2 { 

    var someProperty = 0 

    init() { 
     // Weakly referenced 
     test.subscribe { [weak self] in 
      self?.update() 
     } 
    } 

    func update() { 
     self.someProperty += 1 
    } 
} 

MyClass2() 

をしかし、私はこのような関数のパラメータとしてクロージャに渡す場合、まだ必要な本です?:

class MyClass2 { 

    var someProperty = 0 

    init() { 
     // Avoid retain cycle? 
     test.subscribe(using: update) 
    } 

    func update() { 
     self.someProperty += 1 
    } 
} 

答えて

1

全体の前提(ただし、クロージャーは弱い参照を使用する必要があります)は偽です。最初のコードにweak selfを使用する理由はありませんでした。これは完全に合理的であろう:

init() { 
    test.subscribe { 
     self.update() 
    } 
} 

weak selfを使用することを必要とする理由は、selfを参照クロージャが保持サイクルを引き起こし、selfによってを保持し、それ自体であることです。しかし、ここでは起こっていません。

関連する問題