断点指出“objc_autoreleaseNoPool”

所以我正在debugging一个应用程序准备其应用程序,所以释放,我启用了“所有exception”的通用断点。 从那以后,每次我运行应用程序,控制台打印:

Catchpoint 2(throw)Pending breakpoint 1 – “objc_exception_throw”已解决

objc [11765]:类__NSCFLocale的对象0x8f18ff0 autoreleased没有到位池 – 只是泄漏 – 打破objc_autoreleaseNoPool()debugging

objc [11765]:类__NSCFNumber的对象0x8f190a0 autoreleased没有到位的池 – 只是泄漏 – 打破objc_autoreleaseNoPool()debugging

objc [11765]:类__NSCFLocale的对象0x8f1fef0 autoreleased没有到位池 – 只是泄漏 – 打破objc_autoreleaseNoPool()debugging

直接打印3次。 我不知道这是什么意思,但看起来不好。 任何意见,将不胜感激。

新信息

我通过创build一个混合自动释放方法来确定我的问题所在。

我不build议这样做,除非你知道你在做什么,但是这是我发现的。

+ (void) load; //Method is called outside the original autorelease pool. + (void) initialize; // Method is called outside the original autorelease pool. 

NSThread创build自己的线程,被调用的方法应该被封装在一个自动释放池中。

Grand Central Dispatch在使用“dispatch _…”命令时负责调整autorelease池。 但是,当您手动派遣。 你可能想把它包装在autorelease池中。

此外,ARC不会处理让你知道autorelease会发生在池外。

因此,如果您使用ARC并知道您将在autorelease池之外。 关于这一点,你无能为力。 你会想要避免所有的便利方法。

用这个。

 [[NSString alloc] initWithFormat:@"%@",myObject]; 

而不是这个

 [NSString stringWithFormat:@"%@",myObject]; 

这将允许弧系统保留和释放,但由便捷方法完成的底层autorelease将被跳过,因为您不会使用便捷方法。

希望有所帮助。

原始答复

好吧,我不觉得这个问题有足够的细节。

正在呈现的消息是

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

debugging器指出了一个可能的断点,可以帮助您debugging情况。 现在,虽然这个断点确实没有帮助debugging情况。 我认为知道如何将这个断点添加到debugging器是非常重要的,所以我花了时间修改它(在search了互联网并且什么都没find之前),直到我find了这个错误。

有点烦人的是,所有的错误都不能解决这个问题,但是这里是将断点添加到debugging器的步骤。

首先要做的是selectdebugging器的断点导航器

导航器工具栏

通过点击这个标签

断点按钮

接下来您将看向导航窗格的底部,然后按加号button

添加异常断点

这将允许您手动添加断点。

我select了一个C ++断点,并在名称文本字段中input了消息名称。

添加自定义的C ++异常

在添加这个exception之后,事实上已经中断了。

然而,作为一个客观的c开发者,这可能会对你有用或不可用。 这打破了汇编代码。

汇编代码达到了断点。

不幸的是,它只在线程的调用堆栈上显示了这一点。

线程列表

事实certificateautorelease问题是因为在dispatch_once调用中称为autorelease的类。 并进一步调查发现+(空)负荷; 在类之前的方法被调用之前。 这是通过call_load_methods函数完成的,并且在main方法的线程之外。

错误调用和堆栈

为了纠正这个问题,我只是在调用中添加了autorelease池包装器。

更新的错误调用

另一种解决scheme可能是在+(void)加载中添加autorelease池; 方法。 但是这对我的使用已经足够了。

注:我在这里添加这个post,因为我不喜欢find一个问题,不能找出所得到的答案的所有path。 如果debugging器告诉你为列出的函数添加一个断点,那么应该有一些信息来获取这些信息。 希望这会降低那些试图find这个答案的那些人的挫败感。

cocoa api中的许多方法都会返回自动释放的对象。 特别是那些返回一个不以init开头的对象的方法,比如[NSNumber numberWithLong:] 。 如果你没有一个autorelease池,那些对象将被泄漏。 你可以在文档中find更多关于使用NSAutoreleasePool的信息 。

这意味着你需要在它发生的线程上创build一个自动释放池。 否则,您的分配的对象将不会被销毁(如消息所build议的)。 因此,在符号处暂停/暂停,然后将堆栈移到您的线程(或程序)条目并添加一个自动释放池。 就这样。