weak pointerにselfを保存している場合、deallocが呼ばれるより前にnilになるようです。つまり下記のような実行順序と考えられます。
- オブジェクトを指すstrong pointerの数が0になる
- オブジェクトを指すweak pointerがnullifyされる(nilになる)
- オブジェクトがdeallocされる
僕の場合、Notification Centerに登録する際に登録解除処理をブロックとして保存し、deallocで呼び出すつもりでした。ここでweak pointerを使うとdealloc呼び出し時にはnullifyされていて動作しません。逆に、strong pointerを使っているとそもそもdeallocされません。このような場合、unsafe_unretained pointerを使うことでオブジェクトを解放しつつ、nullifyを避けることができます。iOS4互換のためだけに存在すると思っていたんですが、こんな利用法があるんですね。
でも多分、今回のケースにおける正解は「そんなコードは書かない」だと思います:-p
0 件のコメント:
コメントを投稿