2017-04-26 1 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() 

를, I는이 같은 기능을 매개로 고정 전달할 경우 여전히 필요이

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에 의해 을 유지 때문이다; 그러나 그것은 여기서 일어나지 않습니다.

관련 문제