IOS在main()之前执行什么?

时间:2012-04-23 14:55:24

标签: ios

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"的含义是什么?

3 个答案:

答案 0 :(得分:2)

将2 MPLog移到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;
}

答案 1 :(得分:1)

objc_autoreleaseNoPool处设置符号断点,以在遇到此错误时停止执行。然后,您可以确定放置自动释放池的位置(显式)。

  
    

一般来说,在main()之前会有什么行为?

  

来自+ [NSObject加载]文档:

  

每当将类或类别添加到Objective-C时调用   运行;实现此方法以执行特定于类的行为   负荷。

     

+ (void)load

     

讨论将加载消息发送到动态加载和静态链接的类和类别,但前提是新加载的类或类别实现了可以响应的方法。

     

初始化顺序如下:

     
      
  • 您链接到的任何框架中的所有初始值设定项。
  •   
  • 图片中的所有+加载方法。
  •   
  • 图像中的所有C ++静态初始值设定项和C / C ++ __attribute__(constructor)都起作用。
  •   
  • 链接到您的框架中的所有初始值设定项。
  •   
     

另外:

     
      
  • 在所有超类'+ load方法之后调用类的+ load方法。
  •   
  • 在类自己的+ load方法之后调用category + load方法。
  •   
  • 在自定义的加载实现中,您可以安全地从同一图像中发送其他不相关的类,但这些类实现的任何加载方法可能还没有运行。
  •   

答案 2 :(得分: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 ()

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