きょうじゅんかんさんしょう


ループ参照の概念を簡単に議論しましょう.

強いループリファレンス(strong reference cycle)とは?


2つのインスタンスが互いに参照される場合.
したがって、1つのインスタンスを参照する変数がnilであり、メモリを解放する必要がある場合、
インスタンスがインスタンスを参照しているため、referencecountは1のままです.
メモリを再起動できないため、メモリが漏洩します.

コードで表示

class Person {
    let name: String
    init(name: String) { self.name = name }
    var apartment: Apartment?
    deinit { print("\(name) is being deinitialized") }
}

class Apartment {
    let unit: String
    init(unit: String) { self.unit = unit }
    var tenant: Person?
    deinit { print("Apartment \(unit) is being deinitialized") }
}
Person,Apartmentの2つのクラスが実現された.
それぞれnameunit StringタイプのPropertyです.
相互のタイプ値を変数として使用します.var apartment: Apartment? , var tenant: Person?また、deinit( ) の方法では、プリントゲートによりdealocateであることが確認できる.
var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")  // reference count +1
unit4A = Apartment(unit: "4A")  // reference count +1

PersonインスタンスおよびPartmentインスタンスは、それぞれjohnおよびunit4Aに割り当てられる.
したがって、ARCは、各インスタンスのreferencecountを1つ高める.
john!.apartment = unit4A // Apartment인스턴스 reference count +1 (총2)
unit4A!.tenant = john // Person인스턴스 reference count +1 (총2)

部品インスタンスは、Personインスタンスのapartmentに割り当てられる.
勘定科目科目の勘定科目Apartmentインスタンスの参照数が1増加しました.
Personインスタンスは、Partmentインスタンスのtenantに割り当てられます.
勘定科目のPersonインスタンスの参照数が1増加しました.
john = nil //Person인스턴스 reference count -1 (총1)
unit4A = nil //Apartment인스턴스 reference count -1 (총1)

Personインスタンスを指すjohnとPartmentインスタンスを指すunit4Aをnilに解除することで、2つのインスタンスの参照カウントはそれぞれ1減少する.
ここで問題が発生しました.
互いに強い参照を保っているからだ.
referencecountは1なので、ARCでメモリを無効にすることはありません.
2つのインスタンスのうち1つだけが参照されている場合、変数はnilで、2つのインスタンスは無効になります.
たとえば、部品インスタンスのみが参照されている場合.
john!.apartment = unit4A // Apartment인스턴스 reference count +1 (총2)

2つの変数にnilを指定すると、
john = nil //Person인스턴스 reference count -1 (총0)
//  "john is being deinitialized"
unit4A = nil //Apartment인스턴스 reference count -2 (총0)
//  "unit4A is being deinitialized"
まずPersonインスタンスを無効にします.
次に、Partmentインスタンスは無効になります.

ARCの限界:強いループ参照に気づかない...


ARCは計算インスタンスのreferencecountであり、referencecountが0の場合、インスタンスは自動的に解放され、強いループ参照のインスタンスはインスタンスを解放できません.
強いループ参照の2つのインスタンスreferencecountが1であるため、ARCは2つのインスタンスをメモリに保持します.そのため、メモリの漏洩が発生します.ARCは「あ!あの友達達は強い循環参照だからReferencecountは1だよ!だから解除しなきゃ~」
ARCはRefernece Count(完全)のみを自動的に計算し、メモリの一部を自動的に解放します.
結局、メモリの管理はプログラマーが配慮すべき部分です.
解決策!
  • 遮断強サイクル参照
  • によれば、weakunowned参照がある.