0

アプリを実行すると、次のメッセージが表示されます。

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

これが発生しているスレッドの開始時にNSAutoreleasePoolを作成する必要があることは理解していますが、コードのどこでこれが発生しているかわかりません。問題のオブジェクトが自動解放されたときにヒットするブレークポイントを設定することは可能ですか?

4

3 に答える 3

2

__NSAutoreleaseNoPoolにシンボリックブレークポイントを設定し、ヒットしたときに現在のスレッドを確認できます。これは、XcodeのBreakpoint Navigatorの下部にあるUIを使用するか、必要に応じてGDBコマンドラインで次のコマンドを入力して実行できます。break__NSAutoreleaseNoPool

于 2011-10-10T15:43:46.757 に答える
1

MallocStackLoggingのCocoaDevから:

これは環境変数です。この環境変数が設定されている場合(たとえば、tcshで「setenvMallocStackLogging 1」を使用)、そのシェルで任意のアプリを起動できます。アプリを「開く」のではなく、シェルから起動します。これを行うと、すべてのmallocが追跡されます。次に、別のシェルで「リーク」または「リーク」と言うと、その時点でのアプリのリークの潜在的に膨大なリストが表示されます。

次に、いくつかの一連のアクションをループして、反復間でリークの数が変化するかどうかを確認できます。リークにはIDがあり、アプリの存続期間中は同じままで、サイズと、リークされるオブジェクトのタイプに関する推測、およびリークされたデータの最初のビットのダンプがあります。

リークを修正する最善の方法と、リークダンプに表示されるもののいくつかを解釈する方法を理解することは別のことです。

于 2011-10-10T15:24:04.597 に答える
0

スレッドのメイン関数に自動解放プールを追加するだけで、メモリ管理の問題が解決するはずです。このような

- (void)main
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    ...
    Your code here
    ...

    [pool release];
}

または、新しい構文を使用する場合

- (void)main
{
    @autoreleasepool {
        ... your code here ...
    }
}

とにかく、ファクトリメソッドによって作成された、または明示的に自動リリースされたすべてのNSDateを確認する必要があります。クラスNSDateのすべてのファクトリメソッドを以下に示します。

  • 日にち

  • dateWithNaturalLanguageString:

  • dateWithNaturalLanguageString:locale:

  • dateWithString:

  • dateWithTimeIntervalSinceNow:

  • dateWithTimeInterval:sinceDate:

  • dateWithTimeIntervalSinceReferenceDate:

  • dateWithTimeIntervalSince1970:

Appleのドキュメントから)

于 2011-10-10T15:31:29.933 に答える