2010-09-20

viewDidUnload and dealloc in UIViewController

UIViewControllerを作るときメモリの解放をどこでやるべきか、勘違いしやすいことがあります。

それは、viewDidUnload()の存在です。

NSObjectは、init()でメモリ確保してdealloc()で解放するのがライフサイクルです。UIViewControllerもNSObjectを継承していますので、もちろん同じです。

やってしまいがちなのが、viewDidLoad()で確保したメモリをviewDidUnload()で解放して、dealloc()では解放していないケースです。

viewDidUnload()はviewDidLoad()と対をなす関数で、viewDidLoad()が呼ばれればviewDidUnload()も必ず呼ばれるような気がしますが、実は通常はviewDidUnload()は呼ばれず、いきなりdealloc()が呼ばれます。

init() --> viewDidLoad() --> dealloc()が通常のライフサイクルになります。

viewDidUnload()が何に使われるかというと、OSがメモリ不足になったときにいったんViewだけ解放したい、ときに呼ばれます。それ以外は呼ばれません。

なので正しい実装は、dealloc()ではすべてのメモリは解放する、viewDidUnload()はviewDidLoad()で確保したメモリだけ(すべてのメモリとは限らない、init()をオーバーライドして確保した場合とか)解放する、です。

No comments:

Post a Comment