作者tkdmaf (皮皮快跑)
看板MacDev
标题Re: [讨论] 诡异的………闪退。
时间Thu Apr 28 21:17:12 2022
※ 引述《tkdmaf (皮皮快跑)》之铭言:
: https://gist.github.com/tkdmaf/19790d5bb9f0f3c5070b0d3f364d7071
: 各位如果有空,可以测试这里面的code吗?
: 有个很奇怪的不确定是不是苹果爸爸的Bug.....
: 这当中,只要sub层的Codable中的property假设型态都是String时。
: 只要总合加起来是「14」个,在某些版本或装置上就会闪退……
: (或是我测过String有13个,Int有2个,这种情形也会闪退)
: 有测试的,麻烦请告知:
: CPU:Intel或是M1
: XCode版本、iOS装置及版本(请至少测三种,而且一定要测 15.4)
: 如果最终认定是apple的Issue,可能有必要回报给apple了。
: (我在执行公司的专案中……意外的发现了这个状况。)
: 在几个line群组,有测试的回应有的人会闪退,有的人不会……
: 有点神奇……
本来想说修改文章好还是回自己的文章好。
想了想还是回文吧。
首先,这个问题比较神奇的是同样的Code有人会闪退有人不会闪退。
就算同样是iOS 15.4也是有人闪有人不闪。(也不确定跟手机型号有没关系)
然後就在昨天深夜某位朋友传讯息给我并改了我写的东西加了一点让我自己看。
因为昨晚累的半死我没什麽思考能力,早上才又问他。
大致得到的结论是:
因为struct是call by value。
在跨thread回传资料时可能因为某个条件符合导致回传(组语显示的是mov)
可能从这个记忆体搬到另一个位置时出些了不可预期的问题。
但如果改用class来宣告Codable的资料结构的话。
因为class是call by reference,不会有记忆体搬迁(mov的行为)。
而是跨thread後仍然是参考原本的记忆体位置,所以就没有带出那个不可预期的问题。
当然这都只是猜测。虽然测试上来说,确实改成class来宣告Codable时就不会产生
这样的问题。而且通常都是用於网路资料请求,所以也不太可能发生记忆体参考泄漏的
状况。
总之……就是一个我专案突然闪退让我花了很长的时间一个一个去测才测出这奇怪
闪退的规则(我暂时称之为14个String的结构bug,当然不只有14个String的状况会
发生,不同的型态,有可能会造成这个数字的增减……估计可能跟该属性占用的byte有
关连………)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 49.158.168.152 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/MacDev/M.1651151835.A.9A5.html
1F:推 lemontea0328: ParentData 改成 class 就不会闪退 36.226.90.67 04/29 14:25
2F:→ lemontea0328: 真是奇妙... 36.226.90.67 04/29 14:25
4F:→ lemontea0328: 改这样的话用struct似乎不会坏 36.226.90.67 04/29 14:36
我也不明白为什麽改这样就不会坏。
但是改成这样就变成同步运行而不是非同步运行了。
一个wait处理完才接下去处理後面的。
(解决callback hell的话,这招反倒是挺好用就是了。但我原本的需求是
同时并发,并等待,虽然有传统的NSOperation,但觉得作法比较「罗唆」。)
5F:推 tomhawkreal: 楼上 这表示struct经不起并行存取 36.226.148.87 04/29 14:54
6F:→ tomhawkreal: 不知古典模式是否也如此 36.226.148.87 04/29 14:54
7F:→ lemontea0328: swift-evolution 36.226.90.67 04/29 15:23
8F:→ lemontea0328: 0304-structured-concurrency.md 36.226.90.67 04/29 15:23
9F:→ lemontea0328: 这种写法尚未支援 36.226.90.67 04/29 15:23
※ 编辑: tkdmaf (49.158.168.152 台湾), 04/29/2022 22:52:17
11F:推 appleway: 如果是不同threads 读取资料出问题,你 73.162.181.33 04/29 23:32
12F:→ appleway: 是是看把var 都改成let 73.162.181.33 04/29 23:32
13F:→ appleway: 试试看 73.162.181.33 04/29 23:33
14F:→ tkdmaf: 楼上,我提供的范例是var,但原本是let, 49.158.168.152 04/30 04:29
15F:→ tkdmaf: 情况没变 49.158.168.152 04/30 04:29
16F:推 ethanhuang13: 我跟 Pofat 试过。觉得是编译器的 114.36.67.179 05/08 12:15
17F:→ ethanhuang13: bug。换回 Xcode 13.2.x 就没问题 114.36.67.179 05/08 12:15
如果是编译器的问题的话,基本上……仍然算是苹果爸爸的锅。
※ 编辑: tkdmaf (49.158.168.152 台湾), 05/08/2022 22:44:11
18F:→ ethanhuang13: 那当然。13.3 以上小问题不少,我 114.36.67.179 05/09 13:31
19F:→ ethanhuang13: 继续用 13.2.1 114.36.67.179 05/09 13:31