コンソールに次のエラー メッセージが表示されます。
*** _NSAutoreleaseNoPool(): クラス NSPathStore2 のオブジェクト 0x10d2e0 プールが設置されていない状態で自動解放 - 漏れているだけ
エラーが何であるかわかりませんか?
ありがとう。
コンソールに次のエラー メッセージが表示されます。
*** _NSAutoreleaseNoPool(): クラス NSPathStore2 のオブジェクト 0x10d2e0 プールが設置されていない状態で自動解放 - 漏れているだけ
エラーが何であるかわかりませんか?
ありがとう。
これは古典的なメモリ管理の問題です。自動解放プールを配置せずに一部のオブジェクトを自動解放しています。自動解放は魔法ではありません。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];
}
これで、別のスレッドでコードを実行している場所を把握するだけで済みます。
メソッドを新しいスレッドに生成したようです (おそらく を使用+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument;
)
独自のスレッドで実行されるメソッドは、自動解放されたオブジェクトをキャッチするために、自動解放プールを設定する必要があります。
- (void)myLovelyThreadedMethod
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
... // your code here
[pool release];
}
Clang 静的アナライザーを使用してみる