きょうじゅんかんさんしょう
ループ参照の概念を簡単に議論しましょう.
2つのインスタンスが互いに参照される場合.
したがって、1つのインスタンスを参照する変数が
インスタンスがインスタンスを参照しているため、referencecountは1のままです.
メモリを再起動できないため、メモリが漏洩します.
それぞれ
相互のタイプ値を変数として使用します.
PersonインスタンスおよびPartmentインスタンスは、それぞれ
したがって、ARCは、各インスタンスのreferencecountを1つ高める.
部品インスタンスは、Personインスタンスの
勘定科目科目の勘定科目Apartmentインスタンスの参照数が1増加しました.
Personインスタンスは、Partmentインスタンスの
勘定科目のPersonインスタンスの参照数が1増加しました.
Personインスタンスを指す
ここで問題が発生しました.
互いに強い参照を保っているからだ.
referencecountは1なので、ARCでメモリを無効にすることはありません.
2つのインスタンスのうち1つだけが参照されている場合、変数はnilで、2つのインスタンスは無効になります.
たとえば、部品インスタンスのみが参照されている場合.
2つの変数にnilを指定すると、
次に、Partmentインスタンスは無効になります.
ARCは計算インスタンスのreferencecountであり、referencecountが0の場合、インスタンスは自動的に解放され、強いループ参照のインスタンスはインスタンスを解放できません.
強いループ参照の2つのインスタンスreferencecountが1であるため、ARCは2つのインスタンスをメモリに保持します.そのため、メモリの漏洩が発生します.ARCは「あ!あの友達達は強い循環参照だからReferencecountは1だよ!だから解除しなきゃ~」
ARCはRefernece Count(完全)のみを自動的に計算し、メモリの一部を自動的に解放します.
結局、メモリの管理はプログラマーが配慮すべき部分です.
解決策!遮断強サイクル参照 によれば、
強いループリファレンス(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つのクラスが実現された.それぞれ
name
とunit
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(完全)のみを自動的に計算し、メモリの一部を自動的に解放します.
結局、メモリの管理はプログラマーが配慮すべき部分です.
解決策!
weak
、unowned
参照がある.Reference
この問題について(きょうじゅんかんさんしょう), 我々は、より多くの情報をここで見つけました https://velog.io/@yeahg_dev/순환-참조strong-reference-cycleテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol