13. 순환 인용 해결

1442 단어

자동 참조 계수 작업 메커니즘

  • Swift는 OC와 마찬가지로 자동 참조 수를 사용하여 컨텐츠를 관리합니다.
  • 강한 인용이 특정한 동향을 가리킬 때 이 대상의 인용 계수는 자동으로 +1
  • 이 강력한 인용이 사라지면 인용 계수는 자동으로 -1
  • 참조 수가 0이면 객체가 제거됩니다
  • .

    순환 참조

  • 일반적으로 ARC는 자동으로 메모리 관리를 도와줍니다
  • .
  • 그러나 개발 과정에서 우리는 순환 인용 문제가 자주 발생한다. 예를 들어 아래의 예시
  • Student는 Book 객체에 대한 강력한 참조가 있음
  • Book은Student에 대한 강력한 인용
  • 이 있음
  • 두 대상이 모두nil을 가리킬 때에도 소각되지 않고 순환 인용
  • 이 형성되었다
    // 1. 
    class Student {
        var book : Book?
    
        deinit {
            print("Student -- deinit")
        }
    }
    
    class Book {
        var owner : Student?
    
        deinit {
            print("Book -- deinit")
        }
    }
    
    // 2. 
    var stu : Student? = Student()
    var book : Book? = Book()
    
    // 3. 
    stu?.book = book
    book?.owner = stu
    
    // 4. nil
    stu = nil
    book = nil
    
  • 솔루션
  • swift는 두 가지 해결 방안을 제공했다
  • weak: OC의weak처럼 약한 인용입니다.가리키는 대상이 삭제되면 자동으로 바늘을nil
  • 에 가리킨다
  • unowned: OC의unsafe_unretained.대상이 소각되었을 때 여전히 원래의 위치를 가리킨다

  • // 1. 
    class Student {
        weak var book : Book?
        // unowned var book : Book = Book()
    
        deinit {
            print("Student -- deinit")
        }
    }
    
    class Book {
        var owner : Student?
    
        deinit {
            print("Book -- deinit")
        }
    }
    
    // 2. 
    var stu : Student? = Student()
    var book : Book? = Book()
    
    // 3. 
    stu?.book = book!
    book?.owner = stu
    
    // 4. nil
    stu = nil
    book = nil
    

    좋은 웹페이지 즐겨찾기