正確には Nibから作成したインスタンスの開放。実行途中で Nibを読みこんだ後、不要になったタイミングでこれを破棄する場合の解放方法について調べてみた。
方針については Mac Dev Center にドキュメントがある。
Resource Programming Guide: Nib Files
The Nib Objecvt Life Cycle - Nib Object Retention の所。
ここの説明によれば Top-Level Objects は Nibからインスタンスが作成された段階で retain count が1 となっており、破棄については利用側で責任を持て(すなわち開放しろ)ということになっている。
Top-Level Objects とは Interface Builder へ配置したウィンドウやオブジェクトのこと。
Nib関連のメモリの話は Memory Management of Nib Objects というドキュメントでも触れられている。
Memory Management Programming Guide for Cocoa: Memory Management of Nib Objects
この中では Mac OS X と iPhone OS それぞれでの outlet接続の書き方も紹介されている。
※ iPhone OS の場合は、dealloc 内で開放するコードを書いておく。
For Mac OS X, you should use:
@property (assign) IBOutlet UserInterfaceElementClass *anOutlet;
For iPhone OS, you should use:
@property (nonatomic, retain) IBOutlet UIUserInterfaceElementClass *anOutlet;
以下、Mac OS X の場合について。
- NSWindowでかつ、Release When Closed オプションがある場合は、ウィンドウを閉じた時に自動的に開放される
- File's Owner が NSWindowController の場合、それが管理するウィンドウは自動的に開放される
- 上記に当てはまらない場合は (File's Ownerの)Outlet に接続しておき、必要なタイミングで開放してやる。
- Outlet接続したくない場合は -[NSNib instantiateNibWithOwner:topLevelObjects:] を使うと良い。
※ドキュメントには iPhoneについての記述もある。
- - - - -
まとめ(Mac OS Xの場合)
- Nib から作成された後、Top Level Objects の retain count は 1となる
- Top Level Objects の開放はプログラム側で責任を持つ
- @proprty (assign) IBOutlet で File's Owner へ接続し、開放時にこのリファレンスを使う
- Top Level Objectsが NSWindow(Release When Closed有り)の場合や、NSWindowControllerを使っている場合、これらの開放は自動的に行われる。
開放パターン
(1) Outlet 接続された Top Level Objects を開放(release)する
(2) File's Owner を開放(release)する
実装パターン
(i) File's Owner の dealloc に Outlet接続された Top Level Objects の開放コード(release)を書いておく
(ii) Nibを利用しているプログラムで File's Owner を releaseする(この後 (i)が走り、すべて開放される)