3
objc[1655]: Object 0x2314e0 of class __NSCFString autoreleased with no
pool in place - just leaking - break on objc_autoreleaseNoPool() to
debug

objc[1655]: Object 0x2315e0 of class NSPathStore2 autoreleased with
no pool in place - just leaking - break on objc_autoreleaseNoPool() to
debug

objc[1655]: Object 0x2316b0 of class __NSCFData autoreleased with no
pool in place - just leaking - break on objc_autoreleaseNoPool() to
debug

File:MultiFormatReader.mm Method:+[MultiFormatReader load]  --

objc[1655]: Object 0x2317e0 of class __NSCFString autoreleased with
no pool in place - just leaking -  break on objc_autoreleaseNoPool()
to debug

objc[1655]: Object 0x231800 of class __NSCFData autoreleased with no
pool in place - just leaking
- break on objc_autoreleaseNoPool() to debug

..++++++++

File:main.mm  Method:main  -- mark..

File:BarcodesAppDelegate.m  Method:-[BarcodesAppDelegate
application:didFinishLaunchingWithOptions:]  -
File:BarcodesAppDelegate.m  Method:-[BarcodesAppDelegate
application:didFinishLaunchingWithOptions:]  -

これは相対コードです:

+ (void)load {
    MPLog(@" ..++++++++");
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [FormatReader registerFormatReader:[[[self alloc] init] autorelease]];
    [pool drain];
}


int main(int argc, char *argv[]) {
    MPLog(@"mark..");
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

これは私のデバッグ メッセージです。APP で zxing フレームワークを使用しましたが、main() メソッドが実行される前に、他のコードが既に実行されていることがわかりました。なんで?一般的に言えば、main() の前に何が実行されますか? このプログラム" objc[1655]: Object 0x2314e0 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug"はどういう意味ですか?

4

3 に答える 3

2

下の 2MPLog秒を移動しますNSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];か?

+ (void)load {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    MPLog(@" ..++++++++");
    [FormatReader registerFormatReader:[[[self alloc] init] autorelease]];
    [pool drain];
}


int main(int argc, char *argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    MPLog(@"mark..");
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}
于 2012-04-23T15:00:46.450 に答える
1

objc_autoreleaseNoPoolこのエラーが発生したときに実行を停止するには、シンボリック ブレークポイントを設定します。次に、自動解放プールを配置する必要がある場所を (明示的に) 決定できます。

一般的に言えば、main() の前に何が実行されますか?

+[NSObject load] ドキュメントから:

クラスまたはカテゴリが Objective-C ランタイムに追加されるたびに呼び出されます。このメソッドを実装して、ロード時にクラス固有の動作を実行します。

+ (void)load

説明ロード メッセージは、動的にロードされ、静的にリンクされているクラスとカテゴリに送信されますが、新しくロードされたクラスまたはカテゴリが応答可能なメソッドを実装している場合に限ります。

初期化の順序は次のとおりです。

  • リンク先のフレームワーク内のすべての初期化子。
  • イメージ内のすべての +load メソッド。
  • イメージ内のすべての C++ 静的初期化子と C/C++__attribute__(constructor)関数。
  • あなたにリンクするフレームワークのすべての初期化子。

加えて:

  • クラスの +load メソッドは、そのスーパークラスのすべての +load メソッドの後に呼び出されます。
  • カテゴリの +load メソッドは、クラス自身の +load メソッドの後に呼び出されます。
  • したがって、ロードのカスタム実装では、同じイメージから他の無関係なクラスに安全にメッセージを送信できますが、それらのクラスによって実装されたロード メソッドはまだ実行されていない可能性があります。
于 2012-04-23T15:06:59.983 に答える
0

これと同じ問題が発生しています。メイン スレッドの objc_autoreleaseNoPool にブレークポイントを設定すると、次のような役に立たないスタック トレースが表示されます。
0 0x332097b8 in objc_autoreleaseNoPool ()
1 0x331fe7b8 in (anonymous namespace)::AutoreleasePoolPage::autoreleaseSlow(objc_object*) ()
2 0x332098de in _ZL22_objc_rootAutorelease2P11objc_object ()
3 0x331fcdb6 in _objc_rootAutorelease ()

アプリケーション内の何かが実際に開始される前に、自動解放エラーが発生しているようです。これは、プロジェクトに含めたフレームワークの 1 つにあるいくつかのロード メソッドの結果でしょうか?

于 2012-08-01T13:51:11.497 に答える