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"
的含义是什么?
答案 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 ()
在应用程序中的任何内容实际启动之前,它似乎遇到了自动释放错误。这可能是我在项目中包含的一个框架中的一些加载方法的结果吗?