54980


# 前置き

`swift`でクロージャを書く場合に、`[weak self]`を付けていない場合、循環参照が起こりメモリリークしてしまう場合があります。  
メモリリークしているのは、解放されていないオブジェクトなので、すぐに`self`がどのオブジェクトを参照しているのかソースコード上わかります。

# 質問

今回の質問は、`[weak
self]`を付けていない場合に、付けていないにも関わらず、クロージャ内に記載した`self`は解放されており、コールバックなどで`self`が参照された時点では、使用していたメモリ空間が別のものとして使用され、アプリ自体が落ちる場合があるか？（もしくは不正なメモリをアクセスしてしまうというところまではいかず、単純にnil参照で落ちるだけでしょうか？）という質問となります。


CC BY-SA 4.0
2019-05-15T12:10:57.187
54977
2019-06-29T09:05:59.903
2019-06-29T09:05:59.903
9008
9008
question
swift ios メモリ管理
クロージャに [weak self] をつけていない場合、予期しないメモリを参照することはありますか？


**_`[weak
self]`を付けていない場合に、付けていないにも関わらず、クロージャ内に記載したselfは解放されており、コールバックなどでselfが参照された時点では、使用していたメモリ空間が別のものとして使用され、アプリ自体が落ちる場合があるか？_**

ありません。

`[weak
self]`を付けない場合、`self`はクロージャーに強参照で保持されています。クロージャー自身が生きている限り、`self`の参照先が解放されてしまい、他の用途に使われることはありません。

**_もしくは不正なメモリをアクセスしてしまうというところまではいかず、単純にnil参照で落ちるだけでしょうか？_**

上記したように、`[weak
self]`を付けない場合、`self`の参照先がクロージャーの実行中に解放されることはないので、「nil参照で落ちる」こともあり得ません。

(ちなみに`[weak
self]`を使用すれば、参照先が解放された場合には`self`は`nil`になりますから、不用意に「別のものとして使用され」ていることはないはずです。この場合変なことをすれば、nil落ちするのはもちろんです。`[unowned
self]`だと「プログラマの自己責任」でそんなことは絶対に無いように気をつけて使わないといけません。自分自身で意味が完全に理解できていない限り`[unowned
self]`は使わないほうがいいですね。)

* * *

クロージャーがらみで何か不審な挙動でも見つけられたのでしょうか?もう少し具体的な事例を挙げてもらえれば、何か付け足すことがあるかもしれません。


CC BY-SA 4.0
2019-05-15T12:40:41.033
54980
2019-05-15T12:40:41.033
13972
54977
answer