3

私の iPhone アプリでは、コードがまったく呼び出される前に、アプリの最初の部分でコンソールに 3 つの奇妙な警告が表示されます。

*** __NSAutoreleaseNoPool(): Object 0x84be00 of class NSCFString autoreleased with no pool in place - just leaking
*** __NSAutoreleaseNoPool(): Object 0x84b000 of class NSCFString autoreleased with no pool in place - just leaking
*** __NSAutoreleaseNoPool(): Object 0x849c00 of class NSCFString autoreleased with no pool in place - just leaking

進行状況インジケーターを表示するために、多くの場所で MBProgressHUD を使用します。これは、進行状況インジケーターを表示するときに新しいスレッドをスローするため、この問題の他の議論の一部が指摘しているものです。しかし、最も奇妙なことは、これらが main() 関数の開始前にスローされるように見えることです。

int main(int argc, char *argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

コードの最初の にブレークポイントを設定すると、NSAutoreleasePoolその行が実行される前に、この警告が表示されます。おそらく、この時点までに独自のコードを実行していない場合、エラーの原因は何ですか?

4

5 に答える 5

5

main()この問題を引き起こす前に実行されているコンストラクターがどこかにある可能性があります。リンクしているライブラリ、および/または__attribute__ディレクティブを使用しているライブラリは何ですか?


ハーブ。

明らかなことに気づきました。オブジェクトはリークされているため、まだ存在しています。ブレークポイントをオンに設定main()し、GDB プロンプトで入力します(リークされた文字列の 1 つのアドレスにpo 0x84be00のみ置き換えます)。0x84be00

これにより、その文字列の内容が表示され、原因に関する非常に優れた手がかりが得られます。

ダープ。

ブレークポイントを設定し__NSAutoreleaseNoPoolて、バックトレースが何を示しているかを確認してください。

私は今日、明らかなことで失敗します (私はこの道を 1827 億 1400 万回行ってきたので、明らかです)。

于 2011-03-21T02:14:49.337 に答える
2

メインの実行ループの外部で初期化されている静的変数がアプリのどこかにあります。何かのようなもの:

static UIImage *myImage = [UIImage imageNamed:@"fred.png"];

オブジェクトを初期化する静的変数を探し、applicationDidFinishLaunchingのようなもので初期化して、自動解放プールを設定します。

NSStringがリークしていると表示されていても、どのような種類のオブジェクトでもかまいません。

于 2011-03-21T03:19:52.197 に答える
2

バックグラウンド スレッドを使用するアプリでは、バックグラウンド メソッド内に自動解放プールを作成する必要があります。

-(void)myMethodThatRunsOnBackground:(id)param {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  //body of method

  [pool release];
}

回答クレジット: iphonedevsdk.com の nobre84

于 2011-08-26T14:57:32.907 に答える
2

この問題に対する答えを探していましたが、調査の結果、問題が何であるかを突き止めることができました。私も main が実行される前にこのエラーが発生し、 + (void)load というメソッドを実装することでそれを追跡しました。これは、グローバルクラス固有のデータをロードするのに最適な名前だと思いました。load が実際には既に定義されていて、それを使用するとデフォルトの load がオーバーライドされ、main の前に load が実行されることに気付きませんでした。このように私は漏れていました。名前を myload に変更すると修正されました。

于 2012-02-03T13:19:36.023 に答える
0

autorelease のシンボリック ブレークポイントを配置して、これがいつどこで呼び出されているかを確認できます。

于 2011-03-21T02:02:37.463 に答える