Swift에서closure의 순환 인용 기록

2414 단어

1. controller 정의: Test Controller 및 다음 코드 추가

class TestController: UIViewController {
    
    typealias TestClosure = () -> ()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
    }

    deinit {
        print(self, #function)
    }
    
    // MARK: - private property
    private var name: String = "sdf"
    private var closure: TestClosure?
}

그런 다음 테스트를 위한 방법을 추가합니다.

  • 1
  • func test() {
            
            let closure: TestClosure = {
                self.name = ""
            }
            
            closure()
        }
    

    순환 참조 없음
     closure   name,   self     closure,
                
    
  • 2
  •     func test2() {
            
            let closure: TestClosure = {
                self.name = ""
            }
            
            closure()
            self.closure = closure
        }
    

    회의
    closure   name,self    closure,
              
    
  • 3
  •     func test3() {
            
            let closure: TestClosure = {[weak self] in
                
                let closure1: TestClosure = {
                    self?.name = "dddd"
                }
                closure1()
            }
            
            closure()
            self.closure = closure
        }
    

    할 줄 모르다
    closure    [weak self]   ,     closure  self     ,
       closure1     [weak self]   ,        self closure     self
              
    
  • 4
  •     func test4() {
            
            let closure: TestClosure = {
                
                let closure1: TestClosure = { [weak self] in
                    self?.name = "dddd"
                }
                closure1()
            }
            
            closure()
            self.closure = closure
        }
    

    회의
    closure       [weak self]   ,     closure  self     ,
       closure1    [weak self]   ,        self closure     self
             
    

    결론:

    closure에서 인용했지만 self. 인용하지 않았다면self 인용하지 않았다면closure 순환 인용이 일어나지 않았을 것이다. 만약self 인용이 있었다면closure 이럴 때[weak self] 또는 [unowned self] 수식이 필요하다. 만약에 여러 층closure이 끼워져 있다면 가장 바깥쪽closure에서 수식self해야 한다. 그렇지 않으면 순환 인용이 발생할 수 있다.

    좋은 웹페이지 즐겨찾기