Slide 1

Slide 1 text

Naruki Chigira - Timers inc. GitHub: naru-jpn, Twitter: @naruchigi Unowned / Weak References with Closure

Slide 2

Slide 2 text

ม਺ͷੜଘظؒɺؾʹͯ͠·͔͢ʁ

Slide 3

Slide 3 text

Ϋϩʔδϟ಺Ͱอ࣋͞ΕΔม਺ɺ௥͑·͔͢ʁ

Slide 4

Slide 4 text

DispatchQueue.main.async { [weak self] in // ... }

Slide 5

Slide 5 text

Ϋϩʔδϟ಺Ͱʰ ͱΓ͋͑ͣ [weak self] ʱͯ͠·ͤΜ͔ʁ

Slide 6

Slide 6 text

Playground ͰڍಈΛࡉ͔͘ݟͯΈΑ͏ https://gist.github.com/naru-jpn/fa4c39ce2eda8a803358dad75d04058d

Slide 7

Slide 7 text

class Executor { // MARK: Exeute stored procedure let procedure: () -> () init(procedure: @escaping () -> ()) { self.procedure = procedure } func execute() { self.procedure() } // MARK: Static execution static func execute(procedure: () -> ()) { procedure() } } ΫϩʔδϟΛ࣮ߦ͢ΔΫϥε Executor

Slide 8

Slide 8 text

class Object { var child: Object? weak var weakChild: Object? var closure: (() -> ())? weak var currentExecutor: Executor? } ؍ଌ༻Ϋϥε Object

Slide 9

Slide 9 text

weak var weakObject: Object? = nil // スコープ内外での挙動を見るために if 文でネストさせる // object が解放されていれば weakObject の中身は nil になる if true { let object: Object = Object() weakObject = object print(“\(weakObject)") // nil or not nil? } print(“\(weakObject)") // nil or not nil? ม਺͕ղ์͞Ε͍ͯΔ͔Ͳ͏͔ͷ֬ೝ

Slide 10

Slide 10 text

object object if true { let object: Object = Object() weakObject = object // 1 } // 2 1. ม਺͸είʔϓΛൈ͚ͨΒղ์͞ΕΔ

Slide 11

Slide 11 text

object child object child if true { let object: Object = Object() object.child = object weakObject = object // 1 } // 2 weakObject?.child = nil 2. ࢀরʹΑΔϝϞϦϦʔΫ

Slide 12

Slide 12 text

object child object child if true { let object: Object = Object() object.weakChild = object weakObject = object // 1 } // 2 weakObject?.child = nil 3. weak Λ࢖ͬͯϝϞϦϦʔΫ͠ͳ͍Α͏ʹͨ͠έʔε

Slide 13

Slide 13 text

॥؀ࢀর͸౰વආ͚·͠ΐ͏

Slide 14

Slide 14 text

object closure object closure if true { let object: Object = Object() object.closure = { print("\(object)") } weakObject = object // 1 } // 2 weakObject?.closure = nil 4. Ϋϩʔδϟ͔ΒͷࢀরʹΑΔϝϞϦϦʔΫ

Slide 15

Slide 15 text

object closure object closure if true { let object: Object = Object() object.closure = { [weak object] in print("\(object)") } weakObject = object // 1 } // 2 5. [weak ---] Λ࢖ͬͯϝϞϦϦʔΫ͠ͳ͍Α͏ʹͨ͠έʔε

Slide 16

Slide 16 text

Ϋϩʔδϟͷ॥؀ࢀরʹ΋஫ҙ

Slide 17

Slide 17 text

object closure object object closure object είʔϓ಺ ؔ਺࣮ߦ࣌ ؔ਺ऴྃ࣌ είʔϓ֎ Executor Executor extension Object { func printWeakSelf() { let executor: Executor = Executor(procedure: { [weak self] in debugPrint("\(self)") }) executor.execute() } } 6. Executor ͷΫϩʔδϟ಺Ͱ [weak self] Λ࢖͏৔߹

Slide 18

Slide 18 text

object closure object object closure object είʔϓ಺ ؔ਺࣮ߦ࣌ ؔ਺ऴྃ࣌ είʔϓ֎ Executor Executor if true { let object: Object = Object() object.printWeakSelf() weakObject = object } 6. Executor ͷΫϩʔδϟ಺Ͱ [weak self] Λ࢖͏৔߹

Slide 19

Slide 19 text

object closure object object closure object Executor Executor είʔϓ಺ ؔ਺࣮ߦ࣌ ؔ਺ऴྃ࣌ είʔϓ֎ extension Object { func printSelf() { let executor: Executor = Executor(procedure: { print("\(self)") }) executor.execute() } } 7. Executor ͷΫϩʔδϟ಺Ͱ [weak self] Λ࢖Θͳ͍৔߹

Slide 20

Slide 20 text

object closure object object closure object Executor Executor είʔϓ಺ ؔ਺࣮ߦ࣌ ؔ਺ऴྃ࣌ είʔϓ֎ if true { let object: Object = Object() object.printSelf() weakObject = object } 7. Executor ͷΫϩʔδϟ಺Ͱ [weak self] Λ࢖Θͳ͍৔߹

Slide 21

Slide 21 text

Ϋϩʔδϟ಺Ͱ self Λࢀরͯ͠΋ϦʔΫ͠ͳ͍৔߹΋͋Δ

Slide 22

Slide 22 text

ඇಉظॲཧ଴ػ࣌ ඇಉظॲཧऴྃ࣌ ؔ਺࣮ߦ࣌ object closure closure Executor object closure Executor extension Object { func printAsynchronousWeakSelf() { let executor: Executor = Executor(procedure: { let time: DispatchTime = .now() + 1.0 DispatchQueue.global().asyncAfter(deadline: time, execute: { [weak self] in print("\(self)") }) }) executor.execute() self.currentExecutor = executor } } 8. ඇಉظॲཧͰ [weak self] Λ࢖͏৔߹

Slide 23

Slide 23 text

ඇಉظॲཧ଴ػ࣌ ඇಉظॲཧऴྃ࣌ ؔ਺࣮ߦ࣌ object closure closure Executor object closure Executor if true { let object: Object = Object() object.printAsynchronousSelf() weakObject = object } sleep(UInt32(3.0)) 8. ඇಉظॲཧͰ [weak self] Λ࢖͏৔߹

Slide 24

Slide 24 text

ඇಉظॲཧ଴ػ࣌ ඇಉظॲཧऴྃ࣌ ؔ਺࣮ߦ࣌ object closure object closure Executor object closure Executor extension Object { func printAsynchronousSelf() { let executor: Executor = Executor(procedure: { DispatchQueue.global().asyncAfter(deadline: .now() + 1.0, execute: { print("\(self)") }) }) executor.execute() self.currentExecutor = executor } } 9. ඇಉظॲཧͰ [weak self] Λ࢖Θͳ͍৔߹

Slide 25

Slide 25 text

ඇಉظॲཧ଴ػ࣌ ඇಉظॲཧऴྃ࣌ ؔ਺࣮ߦ࣌ object closure object closure Executor object closure Executor if true { let object: Object = Object() object.printAsynchronousSelf() weakObject = object } sleep(UInt32(3.0)) 9. ඇಉظॲཧͰ [weak self] Λ࢖Θͳ͍৔߹

Slide 26

Slide 26 text

ඇಉظॲཧͰ͸ίʔϧόοΫ࣌ʹ object ͕ੜଘ͍ͯ͠Δ͔Ͳ͏͔͕มΘͬͯ͘Δ

Slide 27

Slide 27 text

ͨͩ͠ɺϦʔΫ͠ͳ͍͜ͱʹมΘΓ͸ͳ͍

Slide 28

Slide 28 text

໨తʹԠͯ͡࢖͍෼͚ΒΕΔΑ͏ʹͳΓ͍ͨͰ͢Ͷ

Slide 29

Slide 29 text

͍͔ͭ [weak self] Λݟͨͱ͖ʹࢥ͍Λ஘ͤͯΈ͍ͯͩ͘͞

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

Motivation / Concept https://developers.google.com/protocol-buffers/ Template message