(2008.9.14) ページを分割し、最新の版に更新。
Mac OS XのObjective-Cは、Leopard (Mac OS X 10.5) からガベージコレクションが有効になりました。しかし、Linuxのgccでは今のところ (gcc 4.3.0), 標準ではガベージコレクションが使用されないようです。
ここでは、Linuxのgccでガベージコレクションを使う方法を紹介します。
ガベージコレクションのライブラリは、Boehm GCがメジャーです。
2008.9現在の最新版はバージョン7.1 (2008.5リリース) です。
自分でコンパイルしてもいいですが、Fedora 9 Linux にはバージョン7.0がパッケージ化されていますので、今回はこれを使ってみます。yumコマンドでインストールします。
# yum install gc-devel
Objective-CでGCを使うには、メモリ関係のフックを書き換えます。
ヘッダ <objc/objc-api.h> で宣言されている_objc_malloc などをそれぞれ設定すれば、オブジェクトの生成などのときにその関数が使われます。
次のサンプルはBoehm GCの関数を設定しています。calloc だけBoehm GCに関数がないので、作りました。
GCなしはこのようにコンパイルします。
$ gcc -Wall objc-gc.m -lobjc
GCありはこう。
$ gcc -Wall -DUSE_GC objc-gc.m -lobjc -lgc
GCなしの場合はメモリが単調に増加しますか、init_alloc_()を呼ぶようにしてBoehm GCの関数を使うようにすれば、メモリ使用量は増えません。