1

コンソールに次のエラー メッセージが表示されます。

*** _NSAutoreleaseNoPool(): クラス NSPathStore2 のオブジェクト 0x10d2e0
    プールが設置されていない状態で自動解放 - 漏れているだけ

エラーが何であるかわかりませんか?

ありがとう。

4

3 に答える 3

11

これは古典的なメモリ管理の問題です。自動解放プールを配置せずに一部のオブジェクトを自動解放しています。自動解放は魔法ではありません。NSAutoreleasePool自動リリースするすべてのオブジェクトを追跡し、「時々」それらをリリースするタイプのオブジェクトがあります。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// An autoreleased object referenced by our pool.
id object = [NSNumber numberWithInt:1]; 
[pool drain];
// Our object no longer valid.

各スレッドには、独自の自動解放プールが必要です。スレッドは「同時に」実行され、それらが共通の自動解放プールを共有している場合、作業中にオブジェクトを解放する可能性があるため、これは非常に論理的です。

今ポイント。すべてのアプリケーションのメイン スレッドにはデフォルトの自動解放プールがあります。つまり、このすべてについて考える必要はなく、自動解放されたオブジェクトは問題なく収集されます。ただし、別のスレッドを作成すると、通常、このスレッドの自動解放プールも作成する必要があります。そうしないと、自動解放されたオブジェクトを主張する人が誰もおらず、単にリークするだけです。これがまさに警告が表示される理由です。

自動解放プールを使用しないスレッドのリークは、次のようになります。

- (void) doSomethingInBackground
{
    id object = [NSNumber numberWithInt:1];
}

- (void) someOtherMethod
{
    [self performSelectorInBackground:@selector(doSomethingInBackground);
}

修正は簡単です:

- (void) doSomethingInBackground
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    id object = [NSNumber numberWithInt:1];
    [pool drain];
}

これで、別のスレッドでコードを実行している場所を把握するだけで済みます。

于 2009-10-21T09:55:04.987 に答える
2

メソッドを新しいスレッドに生成したようです (おそらく を使用+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument;)

独自のスレッドで実行されるメソッドは、自動解放されたオブジェクトをキャッチするために、自動解放プールを設定する必要があります。

- (void)myLovelyThreadedMethod
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    ... // your code here

    [pool release];
}
于 2009-10-21T09:56:10.383 に答える
1

Clang 静的アナライザーを使用してみる

于 2009-10-21T10:02:00.330 に答える