Advanced guard of DeallocationChecker potatotips #66 at Yappli
Referenced URLs: - https://github.com/fastred/DeallocationChecker - https://speakerdeck.com/corin8823/iosdc-2018-memory-leak
"EWBODFEHVBSEPGDeallocationChecker11/11 potatotips #66taiki komaba(@r_plus)
View Slide
UBJLJLPNBCB[email protected]
DeallocationCheckerHJUIVCDPNGBTUSFE%FBMMPDBUJPO$IFDLFSEJTQBUDIBGUFS
DeallocationCheckerviewDidDisappear(_:)࣌ʹͦΕΛ࣮ߦ͢ΔͱϦʔΫνΣοΫग़དྷΔˠνΣοΫ͍ͨ͠WJFXDPOUSPMMFSຖʹݸผʹ࣮ߦ͢Δඞཁ͕͋Δ
ΊΜͲ͍
ࣗಈνΣοΫJ04%$ͷ!DPSJO͞ΜͷૉΒ͍͠-5ʮ໌͔Β͑Δ7JFX$POUSPMMFSͷ.FNPSZ-FBLݕग़ʯΛࢀরIUUQTTQFBLFSEFDLDPNDPSJOJPTEDNFNPSZMFBLʮviewDidDisappear(_:)Λ.FUIPE4XJ[[MJOHͯ͠શͯͷWJFXDPOUSPMMFSΛࣗಈͰ%FBMMPDBUJPO$IFDLFSͷνΣοΫରʹ͠Α͏ʂʯͱ͍͏
White list view controllersͰɺେମ͍͔ͭ͘ྫ֎తͳWJFXDPOUSPMMFS͕ग़ͯ͘Δ্λϒతͳͭͷWJFXDPOUSPMMFSͱ͔Α͘Θ͔ΒΜ4ZTUFN͕ͬͯΔͬΆ͍6*,JUͷͷͱ͔
White list view controllersˣͷ༷ʹνΣοΫલʹHVBSEΛೖΕΔ͜ͱʹͳΔ
ର͕૿͑Δ λϒ͕૿͑Δʹϝϯς͢Δͷ͕ΊΜͲ͍ʢՃ͢Δͷ͕ɺͱ͍͏ΑΓͦΕΛઆ໌ͨ͠ΓΒͳͯͭ͘·ͬͯ͠·͍ແବͳ࣌ؒΛΘͤͯ͠·ͬͨΓ͢Δࣄ͕ɻʣ
White list view controllers͜ͷΜͷHVBSE XIJUFMJTUΛ͏·͍ࣄΓ͍ͨͷʹΑͬͯQSPUPDPM͏ํ๏͋Δ͚Ͳࠓճผख๏
"EWBODFEHVBSEPGDeallocationChecker
Pattern of white listλϒత7$ͷ࣮λϒସͯ͠࠶࡞͠ͳͯ͘ྑ͍༷ʹอ༗ͯ͠Δˡ͜Ε͕νΣοΫʹͻ͔͔ͬΔݪҼͰ͋Δେମͷ࣮DPOUBJOFSWJFXDPOUSPMMFSͷparent͕ࣗΛอ༗ͯ͠Δߏ$POUBJOFSWJFXDPOUSPMMFS͕ϦʔΫνΣοΫʹೖΔલʹparent͕ࣗΛอ༗͍ͯͨ͠Βର֎ʹ͍͔ͨ͠͠͠ viewDidDisappear(_:)ͷͱ͖ʹطʹparentϓϩύςΟOJM
Pattern of white listද͕ࣔΓସΘΔ࣌ʹparent͕ࣗΛอ༗͍ͯ͠Δ͔อଘ͍ͨͦ͠ΕΛͬͯνΣοΫର֎ʹ͢Ελϒͷ7$ΛཏͰ͖Δ
Pattern of white listද͕ࣔΓସΘΔ࣌ʹparent͕OJMͰͳ͍λΠϛϯάͰ͋ΔremoveFromParent(:_) ΛTXJ[[MFparent͕ࣗΛอ༗͍ͯ͠Δ͔อଘ͍ͨ͠Mirrorobjc_{get,set}AssociatedObject
Swizzle
objc_{get,set}AssociatedObject
MirrorparentQSPQFSUZͷܕUIViewController? Ͱ͋ΔͷͰɺͲΜͳܗࣜͰTUPSFEQSPQFSUZʹอଘ͞Ε͍ͯΔ͔Θ͔Βͳ͍ͦ͜ͰMirrorΛར༻͠ϦϑϨΫγϣϯͰTUPSFEQSPQFSUZΛࠪ͢Δ
Mirror୯७ͳTUPSFEQSPQFSUZ
Mirror"SSBZͰอ༗ ͜Ε͕ຆͲ
Mirror%JDUͰอ༗ ݟͨ͜ͱͳ͍
Simplified guardҎ্Swizzling AssociatedObject MirrorͷͭΛΈ߹ΘͤΔͱʜ
Simplified guard͜ͷHVBSEୡ͕ʜ
Simplified guardߦͰεοΩϦʂλϒͷ૿ݮʹࣗಈతʹରԠ
Recap▸ λϒతͳview controllerͰchild view controllerΛอ༗ͯ͠Δέʔεʹ͓͍ͯɺλϒସ࣌ʹdeinit͞Ε͍ͯͳ͍ͷϝϞϦϦʔΫͰͳ͍ʢదʹͳ͍ͬͯΕʣ▸ Swizzling, AssociatedObject, MirrorΛΈ߹ΘͤΕparentͷܕ͕ෆ໌Ͱstored propertyʹࣗΛอ༗͍ͯ͠ΕแׅతʹϦʔΫνΣοΫର֎ͱग़དྷΔ
͓ΘΓ