Slide 1

Slide 1 text

Introduction to Memory Management in Swift 2023/10/26 STORES ϞόΠϧLTձʂ- 2023೥ळͷؾ഑ฤ - @marcy731 - SwiftͷϝϞϦ؅ཧΛ஌Δ -

Slide 2

Slide 2 text

• ਖ਼௚ɺ࠷ۙͷiOSΞϓϦ։ൃʹ͓͍ͯϝϞϦΛҙࣝ͢Δ͜ͱ͸΄ͱΜͲͳ͍ • ͦΜͳதɺ࠷ۙTCAΛ৮͍ͬͯΔͳ͔ͰStack Over f lowΛىͯ͜͠Ϋϥο γϡ͢Δࣄྫʹૺ۰ • ͋ΒͨΊͯSwiftͷϝϞϦ؅ཧΛ؆୯ʹ෮शͯ͠Έͨ എܠ

Slide 3

Slide 3 text

1. ஋ܕͱࢀরܕ 2. ϝϞϦ഑ஔʢStack / Heapʣ 3. ARC (Automatic Reference Counting)ͱࢀরΧ΢ϯτ 4. ॥؀ࢀরͱͦͷରࡦ 5. ڧࢀর / ऑࢀর / ඇॴ༗ࢀর 6. ࠓճૺ۰ͨ͠Stack Over f lowͱͦͷରࡦ ໨࣍

Slide 4

Slide 4 text

• ஋ܕ • σʔλ͕௚઀ίϐʔ͞ΕΔ • ExɿStruct / Enum / Double(Int) / String / Array / Dictionary / Tuple / Set • ϙΠϯτ • Swift͸஋ܕத৺ͷݴޠ • ίϨΫγϣϯܕʢArray, Dictionaryʣ΋ʮcopy-on-writeʯͷ࢓૊ΈͰ஋ܕʹͳ͍ͬͯΔ • ࢀরܕ • σʔλͷ৔ॴ΁ͷࢀর͕ίϐʔ͞ΕΔ • ExɿClass / Function / Clusures ஋ܕͱࢀরܕ

Slide 5

Slide 5 text

• Memory Layout ϝϞϦ഑ஔʢStack / Heapʣ Code / Global Variable Heap Stack Beginning of Memory End of Memory

Slide 6

Slide 6 text

• StackྖҬ • ओʹ஋ܕͷσʔλ΍Ұ࣌తͳσʔλ͕อଘ • ؔ਺ͷݺͼग़͠΍ϩʔΧϧม਺ͷ֨ೲ • ֨ೲ͞Εͨσʔλ͸ɺͦͷείʔϓ΍ϥΠϑαΠΫϧ͕ऴྃ͢Δͱࣗಈతʹղ์ • HeapྖҬ • ࢀরܕͷΠϯελϯε͕อଘ͞ΕΔྖҬ • ϝϞϦͷ֬อ΍ղ์Λ໌ࣔతʹߦ͏ඞཁ͕͋Δ • SwiftͰ͸ARC (Automatic Reference Counting)Λ༻͍ͯࣗಈతʹ؅ཧ ϝϞϦ഑ஔʢStack / Heapʣ

Slide 7

Slide 7 text

• copy-on-assignment • ஋ܕͷσʔλΛ୅ೖ͢Δͱ͖ɺσʔλ͕࣮ࡍʹίϐʔ͞ΕΔੑ࣭ • Φʔόʔϔουͳ͘ߴ଎ʹΞΫηε • copy-on-write • SwiftͷίϨΫγϣϯ౳Ͱར༻͞ΕΔɺσʔλ͕มߋ͞ΕΔ·ͰίϐʔΛ஗Ԇͤ͞Δ࢓૊Έ • ޮ཰తͳϝϞϦ࢖༻Λ࣮ݱ • ྫ͑͹RubyͷArray͸ࢀরܕ͕ͩɺSwiftͷArray͸copy-on-writeͷ࢓૊ΈͰ஋ܕͱͯ͠; Δ·͏ copy-on-assignment / copy-on-write

Slide 8

Slide 8 text

• ՝୊ • ࢀরܕΛ಺෦ʹ࣋ͭStruct͸ɺHeap΁ͷࢀরΛ͍࣋ͬͯΔͨΊɺ׬શʹStack֬อ ͞ΕͨΦϒδΣΫτͱ͸Έͳ͞Εͳ͍ • ͦͷͨΊɺ͜ͷΦϒδΣΫτΛίϐʔ͢ΔͱɺHeap֬อ͕஗͘ͳΓɺίϐʔʹେ͖ ͳίετ͕͔͔Δ • copy-on-writeΛར༻͢Δͱ • ΦϒδΣΫτΛผͷΦϒδΣΫτʹ୅ೖͯ͠΋ɺ஋ܕʢStructͳͲʣ͸ίϐʔ͞Ε ͣɺίϐʔͷ1͕ͭมߋ͞ΕΔ·Ͱࢀর͕࡞੒͞ΕΔ copy-on-write

Slide 9

Slide 9 text

• ARC (Automatic Reference Counting) • HeapྖҬͷϝϞϦ؅ཧͷ࢓૊Έ • ࢀরܕͷΠϯελϯεͷࢀর਺ΛΧ΢ϯτ͢ΔγεςϜ • ͜ͷΧ΢ϯτΛʮࢀরΧ΢ϯτʯͱ͍͏ • ࢀরΧ΢ϯτ • Πϯελϯε΁ͷ৽͍͠ڧ͍ࢀর͕࡞ΒΕΔɹ+1 • ͦͷࢀর͕ͳ͘ͳΔɹ-1 • ࢀরΧ΢ϯτ͕0ʹͳͬͨͱ͖ɺͦͷΠϯελϯε͸ϝϞϦ͔Βղ์ • ARCΛ࢖༻͢Δ͜ͱͰखಈͷϝϞϦղ์ͷඞཁ͕ͳ͘ͳΔ ARCͱࢀরΧ΢ϯτ

Slide 10

Slide 10 text

• ॥؀ࢀর • 2ͭҎ্ͷΦϒδΣΫτ͕ޓ͍ʹڧࢀর͠߹͍ͬͯΔঢ়ଶ • ΦϒδΣΫτ͕ೋ౓ͱ࢖༻͞Εͳ͍ʹ΋͔͔ΘΒͣɺΦϒδΣΫτʹׂΓ౰ ͯΒΕͨϝϞϦ͕ղ์͞Εͳ͍ • ͦͷ݁Ռͱͯ͠ϝϞϦϦʔΫΛҾ͖ى͜͢ঢ়ଶ • ରࡦ • ऑࢀর΍ඇॴ༗ࢀরΛ࢖༻ ॥؀ࢀরͱͦͷରࡦ

Slide 11

Slide 11 text

• ڧࢀর(Strong) • ΦϒδΣΫτ΁ͷ௨ৗͷࢀর • ࢀরΧ΢ϯτ +1 • ऑࢀর(weak) • ΦϒδΣΫτ΁ͷࢀরΛ࣋ͭ΋ͷͷɺࢀরΧ΢ϯτΛ૿΍͞ͳ͍ࢀর • ΦϒδΣΫτ͕ղ์͞ΕΔͱࣗಈతʹnilʹͳΔ • ඇॴ༗ࢀর(unowed) • ऑࢀরͱࣅ͍ͯ·͕͢ɺnilʹͳΔ͜ͱΛڐ༰͠ͳ͍ • ࢀর͍ͯ͠ΔΦϒδΣΫτ͕ղ์͞ΕΔલʹඇॴ༗ࢀরࣗମ͕ղ์͞ΕΔ͜ͱΛอূ͢Δඞཁ͕͋Δ ڧࢀর / ऑࢀর / ඇॴ༗ࢀর

Slide 12

Slide 12 text

• ݪҼ • TCA͸ReduxΞʔΩςΫνϟ • Ruducer / State ͸StructͰఆٛ͞ΕΔ • State͸ࢠStateΛෳ਺࣋ͯΔωετߏ଄ • Structͷωετ͞ΕͨFieldͷංେԽ͸ϥϯλΠϜ࣌ʹStackΛѹഭɺ StackOver f lowʹؕͬͨ • iPhone ͷStackϝϞϦ͸1MB΄Ͳͱখ͍͞ʢSimulator͸8MBʣ • ରࡦ • TCA͸Stackʹ͋ΔσʔλΛHeapʹಀͨ͢ΊʹCoWΛར༻ͨ͠ PresentationStateͱ͍͏࢓૊ΈΛಋೖ͍ͯ͠ΔͷͰɺͦΕΛར༻ • ࢠυϝΠϯͷঢ়ଶΛHeapͰ؅ཧ͢Δ͜ͱͰɺޮ཰త͔ͭ҆શʹঢ়ଶΛ؅ཧ ࠓճૺ۰ͨ͠Stack Over f lowͱͦͷରࡦ

Slide 13

Slide 13 text

• Swift͸ૉ੖Β͍͠ϝϞϦ؅ཧγεςϜΛ࣋ͭ • ͦͷͨΊɺීஈ͋·ΓϝϞϦ؅ཧΛҙࣝͤͣʹΞϓϦ։ൃ͕Ͱ͖Δ • ஫ҙ఺ • ॥؀ࢀরʹ͸ؾΛ͚ͭΑ͏ • ஋ܕͱࢀরܕͷซ༻࣌ʹ͸ؾΛ͚ͭΑ͏ • ͜ͷͱ͖ͷ஋ܕ͸StackͰ͸ͳ͘Heapʹ֨ೲ͞ΕύϑΥʔϚϯε͕མͪΔ • StructΛωετ͠State؅ཧΛ͢Δ৔߹ɺStack Over f lowʹؾΛ͚ͭΑ͏ ·ͱΊ

Slide 14

Slide 14 text

• https://heart-of-swift.github.io/value-semantics/how-to-use-value- types.html • https://aymanmoo.medium.com/copy-on-assignment-vs-copy-on-write-in- swift-c3016b343d06 • ࢀߟ