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;
}

这是我的调试消息,我在我的应用程序中使用了 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

移动MPLog下面的 2 s 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 ()

在应用程序中的任何内容实际启动之前,它似乎已经遇到了自动释放错误。这可能是我在项目中包含的其中一个框架中的一些加载方法的结果吗?

于 2012-08-01T13:51:11.497 回答