iOS Test Online 2022/10/28 https://testonline.connpass.com/event/261910/
࣮ફͭͷϝϞϦϦʔΫ Ͳ͏ݟ͚ͭΔʁJ045FTU0OMJOF,VOJXBL
View Slide
ϝϞϦϦʔΫͱ2
ϝϞϦϦʔΫͱɺ͏༻͞Εͳ͍ Ϧιʔε͕ϝϞϦʹ֬อ͞Εଓ͚Δ͜ͱ[email protected]Λ༁ɾཁͨ͠ͷɻຊޠͷํ ͋·Γ͍͍આ໌Ͱͳ͔ͬͨʜ3
ϝϞϦϦʔΫ͕͋Δͱɺ͑ΔϝϞϦ͕ ঃʑʹݮ͍ͬͯ͘͢ΔͱϝϞϦϓϨογϟʔ͕֤ΞϓϦʹ ͔͚ΒΕɺͦΕͰϝϞϦ͕Βͳ͍ͱ ΞϓϦ͕KFUTBNʢւʹϙΠʣ͞ΕΔৄ͘͠ʮ*EFOUJGZJOHIJHINFNPSZVTFXJUIKFUTBNFWFOUSFQPSUTʯΛࢀরɻ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOYDPEFJEFOUJGZJOHIJHINFNPSZVTFXJUIKFUTBNFWFOUSFQPSUT4
Α͏͢ΔʹϝϞϦϦʔΫͷ͋ΔΞϓϦΛ ࣌ؒ͏ͱڧ੍ऴྃ͞ΕΔˡࠔΔ5
ϝϞϦϦʔΫԿ͕ ݪҼͰى͜Δͷ͔6
॥ࢀর4XJGUࢀরΧϯτํࣜͳͷͰɺ ॥ࢀর͕͋Δͱ॥ࢀরύε্ͷ ΦϒδΣΫτͷࢀরΧϯτ͕ʹ ͳΒͣͥΜͿղ์͞Εͳ͍7
ߪಡղআΕ͏Πϕϯτ͕͜ͳ͍ͷʹߪಡΛ ଓ͚Δͱɺ॥ࢀরͰͳ͍͕ ͏ΘΕͳ͍Ϧιʔε͕ϝϞϦʹ Γଓ͚ΔͷͰϝϞϦϦʔΫʹͳΔ8
ϝϞϦϦʔΫΛ Ͳ͏ݟ͚ͭΔ͔9
10ϝϞϦϦʔΫʹΑΔڧ੍ऴྃͷൃੜΛΔϝϞϦϦʔΫ͕ൃੜ͍ͯ͠ΔॴΛߜΓࠐΉϝϞϦϦʔΫͷݪҼΛಛఆ͢Δ
11ϝϞϦϦʔΫ͕ൃੜ͍ͯ͠ΔॴΛߜΓࠐΉϝϞϦϦʔΫͷݪҼΛಛఆ͢Δࠓͷൃද͜͜ϝϞϦϦʔΫʹΑΔڧ੍ऴྃͷൃੜΛΔ
9DPEFͷ%FCVH/BWJHBUPS9DPEFͷ%FCVH.FNPSZ(SBQI*OTUSVNFOUTͷ-FBLTUBSVOPO9$5"TTFSU/P-FBL121234
9DPEFͷ%FCVH/BWJHBUPSͷϝϞϦάϥϑϝϞϦ༻ྔΛݟΒΕΔ͕ ҙ͕ඞཁʢޙड़ʣ131
9DPEFͷ%FCVH.FNPSZ(SBQI͜ͷϘλϯΛԡ͢ͱग़Δͭ142
ΦϒδΣΫτͷࢀরάϥϑΛݟΒΕΔ159DPEFͷ%FCVH.FNPSZ(SBQI2
ϝϞϦϦʔΫΛݕग़͢Δͱҹ͕ͭ͘169DPEFͷ%FCVH.FNPSZ(SBQI2
*OTUSVNFOUTͷ-FBLT͜ͷϘλϯΛԡ͢ͱग़Δͭ173
183ϝϞϦϦʔΫΛࣗಈݕग़ͯ͠ఆظతʹݕࠪ݁ՌͷϚʔΫ͕ग़ΔʜϦʔΫͳ͠ ʜ৽ϦʔΫ͋Γ ʜ৽ϦʔΫͳ͠*OTUSVNFOUTͷ-FBLTϝϞϦͷ༻ྔάϥϑ͕ݟΒΕΔ
UBSVOPO9$5"TTFSU/P-FBL194
ϝϞϦϦʔΫΛݕग़͢Δͱςετ͕ࣦഊ͢Δ20UBSVOPO9$5"TTFSU/P-FBL4
ϝϞϦϦʔΫΛݕग़͢Δͱςετ͕ࣦഊ͢Δ21UBSVOPO9$5"TTFSU/P-FBL4
͜ΕΒͷπʔϧΛͬͯͭͷϝϞϦϦʔΫΛݟͯΈ·͠ΐ͏22
ͭͷϝϞϦϦʔΫΛൃੜͤ͞Δ ΞϓϦΛ༻ҙ͠·ͨ͠23
,VOJXBL.FNPSZ-FBL1MBZHSPVOEʮ&YFSDJTF9ʯΛλοϓ͢Δͱɺ ͞·͟·ͳछྨͷϝϞϦϦʔΫΛ Ҿ͖ى͜͠·͢24
&YFSDJTFpublic class Exercise1_1 {var value: Any?private let weight = Weight1()}public static func exercise1_1() -> Exercise1_1 {let x = Exercise1_1()x.value = xreturn x}॥ࢀরΛͭ͘ΔάϥϑͷมԽΛΘ͔Γ͘͢ ͢ΔͨΊͷେ͖ͳΦϒδΣΫτ25
&YFSDJTFclass Weight1 {private var data: [UInt64] = Array( repeating: 0,count: 1024 * 1024)}͓Αͦ.J#ͷ༰ྔΛ֬อ26
9DPEFͷ%FCVH/BWJHBUPS271
&YFSDJTFΛλοϓ͢Δͱ ૿͑ͨ··ݮΒͳ͍ʢϝϞϦϦʔΫ͍ͯ͠Δʣ281
9DPEFͷ%FCVH.FNPSZ(SBQI292
ϝϞϦϦʔΫͷࣗಈݕʹҾ͔͔ͬͬͨ॥ࢀরͷ༷ࢠΛڭ͑ͯ͘ΕΔ302
*OTUSVNFOUTͷ-FBLT313
ϝϞϦϦʔΫͷࣗಈݕʹҾ͔͔ͬͬͨ૿͑ͨ··ݮ͍ͬͯͳ͍ʢϦʔΫ͍ͯ͠Δʣ323
9$5"TTFSU/P-FBL334
ϝϞϦϦʔΫΛݕͨ͠344
&YFSDJTF·ͱΊ%FCVH/BWJHBUPS%FCVH.FNPSZ(SBQI*OTUSVNFOUTͷϝϞϦάϥϑ*OTUSVNFOUTͷࣗಈݕ9$5"TTFSU/P-FBL✅ ✅ ✅ ✅ ✅35
&YFSDJTFpublic class Exercise1_2 {var value: Any?private let weight = Weight2()}public static func exercise1_2() -> Exercise1_2 {let x = Exercise1_2()x.value = xreturn x}॥ࢀরΛͭ͘ΔάϥϑͷมԽΛΘ͔Γ͘͢ ͢ΔͨΊͷେ͖ͳΦϒδΣΫτ36
&YFSDJTF@implementation Weight2- (id)init {if (self = [super init]) {size_t size8MiB = 8*1024*1024;void* mem = malloc(size8MiB);if (mem == NULL) {return self;}// NOTE: Avoid memory overcommit.memset(mem, size8MiB, 1);_mem = mem;}return self;}NBMMPDͰಉ͡༰ྔͷϝϞϦΛ ֬อ͍ͯ͠Δ37
9DPEFͷ%FCVH/BWJHBUPS381
ΜʁͳΜ͔มΘͬͨʜ͔ʁʢɿಉ͡༰ྔΛϝϞϦϦʔΫͯ͠·͢ʣ391
9DPEFͷ%FCVH.FNPSZ(SBQI402
ϝϞϦϦʔΫͷࣗಈݕʹҾ͔͔ͬͬͨ॥ࢀরͷ༷ࢠΛڭ͑ͯ͘ΕΔ412
*OTUSVNFOUTͷ-FBLT423
ϝϞϦϦʔΫͷࣗಈݕʹҾ͔͔ͬͬͨ૿͑ͨ··ݮ͍ͬͯͳ͍ʢϦʔΫ͍ͯ͠Δʣ433
9$5"TTFSU/P-FBL444
ϝϞϦϦʔΫΛݕͨ͠454
&YFSDJTF·ͱΊ%FCVH/BWJHBUPS%FCVH.FNPSZ(SBQI*OTUSVNFOUTͷϝϞϦάϥϑ*OTUSVNFOUTͷࣗಈݕ9$5"TTFSU/P-FBL🤔 ✅ ✅ ✅ ✅46NBMMPDͰ֬อ͞ΕͨϝϞϦ͕දࣔ͞Εͳ͍
&YFSDJTFpublic class Exercise1_3 {var value: Any?private let weight = Weight3()}public static func exercise1_3() -> Exercise1_3 {let x = Exercise1_3()x.value = xreturn x}॥ࢀরΛͭ͘ΔάϥϑͷมԽΛΘ͔Γ͘͢ ͢ΔͨΊͷେ͖ͳΦϒδΣΫτ47
&YFSDJTFclass Weight3 {private let data = Data(count: 8 * 1024 * 1024)}48%BUBͰಉ͡༰ྔͷϝϞϦΛ֬อ
9DPEFͷ%FCVH/BWJHBUPS491
ΜʁͳΜ͔มΘͬͨʜ͔ʁʢɿಉ͡༰ྔΛϝϞϦϦʔΫͯ͠·͢ʣ501
&YFSDJTF·ͱΊ%FCVH/BWJHBUPS%FCVH.FNPSZ(SBQI*OTUSVNFOUTͷϝϞϦάϥϑ*OTUSVNFOUTͷࣗಈݕ9$5"TTFSU/P-FBL🤔 ✅ ✅ ✅ ✅51%BUBͰ֬อ͞ΕͨϝϞϦ͕දࣔ͞Εͳ͍
&YFSDJTFpublic static func exercise2() -> Exercise2 {let x = Exercise2()var values = [Any]()values.append(Weight2() as Any)for _ in 0..<100 {values.append(Exercise2())}let y = Indirect()values.append(y)y.value = ["y": x]for _ in 0..<100 {values.append(Exercise2())}x.value = valuesreturn xάϥϑͷมԽΛΘ͔Γ͘͢ ͢ΔͨΊͷେ͖ͳΦϒδΣΫτ॥ࢀরΛՃແؔͳࢀরΛͨ͘͞ΜՃແؔͳࢀরΛͨ͘͞ΜՃ52
&YFSDJTF·ͱΊ%FCVH/BWJHBUPS%FCVH.FNPSZ(SBQI*OTUSVNFOUTͷϝϞϦάϥϑ*OTUSVNFOUTͷࣗಈݕ9$5"TTFSU/P-FBL🤔 ✅ ✅ ✅ ✅53
&YFSDJTFpublic static func exercise3() -> Exercise3 {let x = Exercise3()let y = Indirect()x.value = yvar prev = yfor _ in 0..<100 {let z = Indirect()prev.value = zprev = z}prev.value = xେͳ॥ࢀরύεΛઃఆ54
9DPEFͷ%FCVH/BWJHBUPS551
ΜʁͳΜ͔มΘͬͨʜ͔ʁʢɿಉ͡༰ྔΛϝϞϦϦʔΫͯ͠·͢ʣ561
9DPEFͷ%FCVH.FNPSZ(SBQI572
ϝϞϦϦʔΫͷࣗಈݕʹҾ͔͔ͬΒͳ͍ʂ582
*OTUSVNFOUTͷ-FBLT593
ϝϞϦϦʔΫͷࣗಈݕʹҾ͔͔ͬΒͳ͍ʂ૿͑ͨ··ݮ͍ͬͯͳ͍ʢϦʔΫ͍ͯ͠Δʣ603
9$5"TTFSU/P-FBL614
ϝϞϦϦʔΫΛݕͨ͠624
&YFSDJTF·ͱΊ%FCVH/BWJHBUPS%FCVH.FNPSZ(SBQI*OTUSVNFOUTͷϝϞϦάϥϑ*OTUSVNFOUTͷࣗಈݕ9$5"TTFSU/P-FBL🤔 ❌ ✅ ❌ ✅େͳ॥ࢀরݕͰ͖ͣ େͳ॥ࢀরݕͰ͖ͣ63
&YFSDJTFpublic class Exercise4 {var value: Any?private let weight = Weight1()init() {let x = Indirect()x.value = { _ = self }self.value = x}}Ϋϩʔδϟ͕ࣗΛڧࢀরͰ Ωϟϓνϟͯ͠॥ࢀরͤ͞Δ64
&YFSDJTF·ͱΊ%FCVH/BWJHBUPS%FCVH.FNPSZ(SBQI*OTUSVNFOUTͷϝϞϦάϥϑ*OTUSVNFOUTͷࣗಈݕ9$5"TTFSU/P-FBL🤔 ✅ ✅ ✅ ✅65
&YFSDJTFpublic static func exercise5() -> Exercise5_1 {let x = Exercise5_1()let y = Exercise5_2.init(x)x.value = yreturn x}0CKFDUJWF$ͱ4XJGUͷؒͰ ॥ࢀরͤ͞Δ66
&YFSDJTF·ͱΊ%FCVH/BWJHBUPS%FCVH.FNPSZ(SBQI*OTUSVNFOUTͷϝϞϦάϥϑ*OTUSVNFOUTͷࣗಈݕ9$5"TTFSU/P-FBL🤔 ✅ ✅ ✅ ✅67
&YFSDJTFpublic class Exercise6: EventHubObserver {private let weight = Weight2()init() {EventHub.shared.add(observer: self)}deinit {EventHub.shared.removeObserver(observer: self)}}EFJOJUͰߪಡղআ͢Δ͜ͱΛ ҙਤͨ͠ίʔυ͕ͩɺ ͦͦߪಡղআ͞Εͳ͍ͱ ࢀর͕͍ͬͯͯEFJOJU͕ Βͳ͍ͷͰϝϞϦϦʔΫ͢Δ68
&YFSDJTF·ͱΊ%FCVH/BWJHBUPS%FCVH.FNPSZ(SBQI*OTUSVNFOUTͷϝϞϦάϥϑ*OTUSVNFOUTͷࣗಈݕ9$5"TTFSU/P-FBL🤔 ❌ ✅ ❌ ✅॥ࢀরͰͳ͍ͷͰݕͰ͖ͣ ॥ࢀরͰͳ͍ͷͰݕͰ͖ͣ69
&YFSDJTFpublic class Exercise7 {var value: Any?private let weight = Weight2()public class Indirect: CustomReflectable {var value: Any?public var customMirror: Mirror {return Mirror(self, children: [])}}.JSSPS SFflFDUJOHͰ ԿTUPSFEQSPQ͕ ͳ͍ͱࡨ֮ͤ͞Δ70
&YFSDJTF·ͱΊ%FCVH/BWJHBUPS%FCVH.FNPSZ(SBQI*OTUSVNFOUTͷϝϞϦάϥϑ*OTUSVNFOUTͷࣗಈݕ9$5"TTFSU/P-FBL🤔 ✅ ✅ ✅ ❌.JSSPSʹґଘ͍ͯ͠ΔͷͰ$VTUPN3FflFDUBCMF͕ ࣮͞Ε͍ͯΔΦϒδΣΫτͰෆਖ਼֬ͳ݁ՌʹͳΔ71
&YFSDJTF·ͱΊ&YFSDJTF %FCVH/BWJHBUPS%FCVH.FNPSZ(SBQI*OTUSVNFOUTͷϝϞϦάϥϑ*OTUSVNFOUTͷ ࣗಈݕ9$5"TTFSU/P-FBL ✅ ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ❌ ✅ ❌ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ❌ ✅ ❌ ✅ 🤔 ✅ ✅ ✅ ❌72
&YFSDJTF·ͱΊ&YFSDJTF %FCVH/BWJHBUPS%FCVH.FNPSZ(SBQI*OTUSVNFOUTͷϝϞϦάϥϑ*OTUSVNFOUTͷ ࣗಈݕ9$5"TTFSU/P-FBL ✅ ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ❌ ✅ ❌ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ❌ ✅ ❌ ✅ 🤔 ✅ ✅ ✅ ❌NBMMPDͰ֬อ͞ΕͨϝϞϦ%BUBͳͲͷϝϞϦ ༻ྔ͕ݟ͑ͳ͍ɻϝϞϦϦʔΫͯ͠ͳ͍Α͏ʹ ݟ͑ͯϝϞϦϦʔΫ͍ͯ͠Δ͜ͱ͕͋Γ͏Δ73
&YFSDJTF·ͱΊ&YFSDJTF %FCVH/BWJHBUPS%FCVH.FNPSZ(SBQI*OTUSVNFOUTͷϝϞϦάϥϑ*OTUSVNFOUTͷ ࣗಈݕ9$5"TTFSU/P-FBL ✅ ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ❌ ✅ ❌ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ❌ ✅ ❌ ✅ 🤔 ✅ ✅ ✅ ❌॥ࢀরύε͕͍߹ɺߪಡͷ ղআΕݕͰ͖ͳ͍ɻࣗಈݕͰ ϝϞϦϦʔΫ͕͋ΔͱݴΘΕͨ߹ ৴༻ͯ͠ྑ͍͕ɺٯա৴͍͚ͯ͠ͳ͍74
&YFSDJTF·ͱΊ&YFSDJTF %FCVH/BWJHBUPS%FCVH.FNPSZ(SBQI*OTUSVNFOUTͷϝϞϦάϥϑ*OTUSVNFOUTͷ ࣗಈݕ9$5"TTFSU/P-FBL ✅ ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ❌ ✅ ❌ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ❌ ✅ ❌ ✅ 🤔 ✅ ✅ ✅ ❌҆ఆͯ͠ϝϞϦͷ༻ྔͷ૿ݮΛ ֬ೝͰ͖͍ͯΔɻϝϞϦϦʔΫͷ ༗ແΛௐ͍ͨͳΒ·ͣ͜ΕΛݟΔ͖75
&YFSDJTF·ͱΊ&YFSDJTF %FCVH/BWJHBUPS%FCVH.FNPSZ(SBQI*OTUSVNFOUTͷϝϞϦάϥϑ*OTUSVNFOUTͷ ࣗಈݕ9$5"TTFSU/P-FBL ✅ ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ❌ ✅ ❌ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ❌ ✅ ❌ ✅ 🤔 ✅ ✅ ✅ ❌॥ࢀরύε͕͍߹ɺߪಡͷ ղআΕݕͰ͖ͳ͍ɻࣗಈݕͰ ϝϞϦϦʔΫ͕͋Δͱࢦఠ͞Εͨ߹ ৴༻ͯ͠Α͍͕ɺͳ͍ͱࢦఠ͞Εͨ߹ա৴͍͚ͯ͠ͳ͍76
&YFSDJTF·ͱΊ&YFSDJTF %FCVH/BWJHBUPS%FCVH.FNPSZ(SBQI*OTUSVNFOUTͷϝϞϦάϥϑ*OTUSVNFOUTͷ ࣗಈݕ9$5"TTFSU/P-FBL ✅ ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ❌ ✅ ❌ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ✅ ✅ ✅ ✅ 🤔 ❌ ✅ ❌ ✅ 🤔 ✅ ✅ ✅ ❌·Εʹ$VTUPN3FflFDUBCMFΛ࣮͍ͯ͠Δ ΦϒδΣΫτ͕͋ΔͷͰҙ͕ඞཁɻϝϞϦϦʔΫ͕͋Δͱࢦఠ͞Εͨ߹ ৴༻Ͱ͖Δ͕ɺͳ͍ͱࢦఠ͞Εͨ߹ ա৴͍͚ͯ͠ͳ͍77
·ͱΊwϝϞϦϦʔΫΛ୳͢ʹ·ͣ*OTUSVNFOUTͷ-FBLTͷ ϝϞϦ༻ྔάϥϑΛݟΔͱΑ͍wͦΕҎ֎ͷํ๏ϝϞϦϦʔΫ͕͋ͬͯݟམͱ͢ Մೳੑ͕͋ΔͷͰɺ݁ՌΛա৴͠ͳ͍ํ͕Α͍78