Avatar
omochimetaru 6/21/2019 5:22 AM
呼ばないといけません
5:22 AM
Swiftのメモリモデルでは、メモリ領域は、「初期化済み」と「未初期化」があって、
5:23 AM
UnsafeMutablePointer.allocateしたメモリ領域は「未初期化」であり、
5:23 AM
.pointeeにアクセスしてよいのは「初期化済み」のときだけです。
5:23 AM
pointeeに直接入れるのと何が違うのかというと
5:24 AM
pointeeへの書き込みは「既存の値の破棄」と「新しい値の構築」の2つの手順を含むからです これは通常の変数への代入のときも同じことです
5:24 AM
initializeによる書き込みは、書き込み先メモリが未初期化であることを仮定しているので
5:24 AM
「既存の値の破棄」がスキップされて「新しい値の構築」だけが実行されます。
5:25 AM
もし、未初期化のメモリ領域 に対して、「既存の値の破棄」を行ってしまうと
5:26 AM
例えば、その型が参照型のstored propertyを含む場合に、 ランダムなアドレスに対してアクセス(参照カウンタのdecrement)する事になって、ランタイムクラッシュするなどの可能性があります。
5:26 AM
「struct の中で参照型を保持してるような場合」 ↑それであってます。