7

私はC++で書かれたマルチプラットフォームゲームを持っています。Macバージョンでは、obj-cコードがありませんが、使用しているライブラリの1つが自動解放機能のようで、NSAutoreleasePoolを作成しなかったため、メモリリークが発生します。

私が望んでいるのは、obj-cコードを使用せずにNSAutoreleasePoolを作成(および破棄)できるようにすることです。したがって、.mファイルを作成する必要はなく、そのためだけにビルドスクリプトを変更します。それは可能ですか?どうすればそれができますか?

OBS:タグ付きのCおよびC++。これらの言語のいずれのソリューションでもかまいません。

4

1 に答える 1

2

Objective-Cランタイムのインスタンス化を回避することはできませんが、明らかにそれらの1つをすでに持っています。

Cからランタイムを操作する場合は、 Objective-CランタイムプログラミングガイドおよびObjective-Cランタイムリファレンスに記載されているように、Objective-CランタイムAPIを使用できます。

アイデアは次のようなものです(テストされていません):

#include <objc/runtime.h>
#include <objc/objc-runtime.h>
id allocAndInitAutoreleasePool() {
  Class NSAutoreleasePoolClass = objc_getClass("NSAutoreleasePool");
  id pool = class_createInstance(NSAutoreleasePoolClass, 0);
  return objc_msgSend(pool, "init");
}
void drainAutoreleasePool(id pool) {
  (void)objc_msgSend(pool, "drain");
}

これらの関数を別のファイルから呼び出したい場合は、もちろん、そこにもobjc/runtime.hを含める必要があります。または、allocAndInit関数からの戻りでidをvoid *にキャストし、void*を取得してdrain関数でidにキャストバックすることもできます。(structobjc_objectとtypedefstruct objc_object * idを前方宣言することもできますが、実際には正しい定義であるとは限りません。)

linkコマンドで-lobjcを渡す必要はありません。

言うまでもなく、ビルドスクリプトで.mファイルを処理するだけの作業はおそらく少なくなります。

于 2012-06-28T03:45:16.597 に答える