C 言語では、実行時に動的に確保したメモリ領域は、必ず解放しなければなりませんでした。 標準関数の malloc() で確保したメモリ領域は free() 関数で解放しなければ、メモリ領域が不要になり、メモリへの参照が失われた後も、アプリケーションのために待機し続けるため、結果としてメモリリークとなります。
Objective-C でもこれは同様で、Java や Microsoft .NET のように、メモリを自動的に解放する機能は存在しません。 そこで、Object をルートクラスとする alloc で確保されたインスタンスは、不要になった時点で free メッセージを送信して解放しなければなりません。
free メッセージは、そのインスタンスが確保しているメモリ領域を開放し、インスタンスを完全に破棄するために送信されます。 イニシャライザに対して、インスタンスが破棄されるタイミングで何らかの処理が必要な場合は free メッセージをオーバーライドすると良いでしょう。 ただし、オーバーライドの際はスーパークラスに free を送信することを忘れてはなりません。
#import <stdio.h> #import <objc/Object.h> @interface Test : Object -(id)init; -(id)free; @end @implementation Test - (id)init { id obj = [super init]; printf("init method\n"); return obj; } - (id)free { printf("free method\n"); return [super free]; } @end int main() { id obj = [Test new]; [obj free]; return 0; }
このプログラムの main() 関数部分では、インスタンスを new メッセージで生成、及び初期化し、直後に free メッセージで破棄しています。 init と free メソッドをオーバーライドし、メソッドが実行されたことを証明するために文字列を出力しています。
通常、初期化はルートクラスから行われ、解放はリーフから行われます。 init メソッドでは、メソッドの先頭で親クラスの init メソッドを呼び出し、free メソッドではメソッドの末尾で親クラスの free を呼び出します。