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

IOS在main()之前执行什么?,ios,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 leak

这是相关代码:

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:]  -
这是我的调试消息,我在我的应用程序中使用了zxing框架,但我发现在main()方法执行之前,已经执行了一些其他代码。为什么?一般来说,在main()之前执行什么?
这个程序是什么意思?“objc[1655]:类的对象0x2314e0在没有池的情况下自动释放-只是泄漏-在objc\u autoreleaseNoPool()上中断以调试”意味着什么?

移动下面的2
MPLog
s
NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init]

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

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

一般来说,在main()之前有什么例外

来自+[NSObject load]文档:

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

+(无效)加载

讨论加载消息发送到动态加载和静态链接的类和类别,但仅当新加载的类或类别实现了可以响应的方法时

初始化的顺序如下:

  • 链接到的任何框架中的所有初始值设定项
  • 图像中的所有+加载方法
  • 所有C++静态初始化器和C++ C/< <代码>属性>(构造函数)< /C>函数在您的映像中。
  • 框架中链接到您的所有初始值设定项
此外:

  • 类的+load方法在其所有超类的+load方法之后调用
  • 在类自己的+load方法之后调用category+load方法
  • 因此,在load的自定义实现中,您可以安全地从同一映像向其他不相关的类发送消息,但这些类实现的任何load方法可能尚未运行

我看到了同样的问题。如果我在主线程的objc_autoreleasenool上放置一个断点,就会得到以下无用的堆栈跟踪:
objc_autoreleasenool()中的
0 0x332097b8
(匿名命名空间)中的1 0x331fe7b8::AutoreleasePoolPage::autoreleaseSlow(objc_object*)()
2X11OBJC对象()中的2 0x332098de 3 0x331fcdb6在_objc_rootAutorelease()中


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

注释掉这两行MPLog,看看您是否仍然存在问题,这样我们就可以确定是不是这导致了问题。当第一行MPLog注释掉时,这是正常的,就像这样:File:main.mm Method:main--mark..那么我在答案中显示的是有效的吗?这是因为您需要先调用
NSAutoreleasePool
。把它想象成分配给应用程序的内存池,如果没有分配内存,字符串就会泄漏。如果我的答案解决了你的问题,请按我答案左边的勾号。谢谢把这个放在这里,否则stacktrace基本上是不可读的。
+ (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;
}