それは、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