3

Linux、Windows、Mac OS Xで動作する必要のあるアプリケーションを開発しています。そのために、QtでC++を使用しています。

CFBundleCopyBundleURL多くの理由で、Mac OS Xでは、でリリースする必要のあるコアオブジェクトを作成するCoreFoundation関数(など)を使用する必要がありCFReleaseます。しかし、そうすることで、これらの警告がたくさん生成されます。

*** __NSAutoreleaseNoPool(): Object 0x224f7e0 of class NSURL autoreleased with no pool in place - just leaking

これらの自動解放プールに関して私が見たすべてのコードは、Objective-Cで書かれています。CまたはC++で自動解放プールを作成/使用する方法を知っている人はいますか?

4

4 に答える 4

2

http://www.codeproject.com/KB/cpp/memreleasepool.aspxを参照してください

于 2010-11-04T16:08:29.130 に答える
1

これらの自動解放プールに関して私が見たすべてのコードは、Objective-Cで書かれています。

自動リリースプールはCocoaとCocoaTouchにのみ存在するためです。

CまたはC++で自動解放プールを作成/使用する方法を知っている人はいますか?

これを行う唯一の方法は、Cocoaコード(プールの作成と排出)をC関数のペアでラップすることです。それでも、それは醜いハックであり、より深い問題を覆い隠すだけです。

あなたが本当にすべきことは、自動解放オブジェクトが何であるかを正確に見つけ(楽器はこれを行うのに役立ちます)、それを修正するか、それを削除することです。

于 2010-04-01T08:13:45.987 に答える
1

idC宣言です。次のように、スコープベースの自動解放プールをcppプログラムに追加するだけです。

autorelease_pool.hpp

class t_autorelease_pool {
public:
    t_autorelease_pool();
    ~t_autorelease_pool();
private:
    id d_pool; // << you may opt to preprocess this out on other platforms.
private:
    t_autorelease_pool(const t_autorelease_pool&);
    t_autorelease_pool& operator=(const t_autorelease_pool&);
};

autorelease_pool.mm

t_autorelease_pool::t_autorelease_pool() : d_pool([NSAutoreleasePool new]) {}
t_autorelease_pool::~t_autorelease_pool() { [this->d_pool drain]; }

cppプログラムの場合:

void UpdateUI() {
    t_autorelease_pool pool;
    // your/their autoreleasing code here
}

別の方法(誤って使用するのは非常に簡単です)は、ObjCランタイムを直接使用することです-これは次のCプログラムのようになります:

#include <objc/runtime.h>
#include <objc/message.h>
...
id pool = objc_msgSend(objc_getClass("NSAutoreleasePool"), sel_getUid("new")); 
/* do stuff */
objc_msgSend(pool, sel_getUid("drain"));
于 2011-11-11T14:39:21.967 に答える
0

発生するエラーは、便利な静的メソッド[NSURL urlWithString:]を使用してObjective-Cクラス(NSURL)を作成していることが原因で発生します。「alloc」または「copy」ではないオブジェクトを返すメソッドは、オブジェクトを返す前に、オブジェクトを自動解放プール内に配置する必要があります。また、セットアップしていないため、クラッシュするか、メモリがリークするだけです。

これを修正する方法は正確にはわかりませんが、次のようなものを入力する必要があります。

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
doStuff();
[pool release];

コードのどこかに。

于 2010-10-21T03:00:30.897 に答える