objective-c - 断点指向 "objc_autoreleaseNoPool"

标签 objective-c ios xcode breakpoints

所以我正在调试一个应用程序,为它的应用程序发布做准备,我为“所有异常”启用了一个通用断点。从那时起,每次我运行该应用程序时,控制台都会打印:

Catchpoint 2 (throw)Pending breakpoint 1 - "objc_exception_throw" resolved

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

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

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

字面上打印了 3 次。我不知道这意味着什么,但它看起来很糟糕。任何建议将不胜感激。

最佳答案

新信息

我通过创建一个 swizzled autorelease 方法确定了我的问题所在。

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

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

NSThread 创建自己的线程,被调用的方法应该包装在自动释放池中。

Grand Central Dispatch 在使用“dispatch_...”命令时负责适应自动释放池。但是,当您手动发送时。你可能想把它包装在一个自动释放池中。

此外,ARC 不会让您知道自动释放将在池外发生。

因此,如果您正在使用 ARC 并且知道您将在自动释放池之外。你对此无能为力。您将希望避免使用所有方便的方法。

使用这个。

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

而不是这个

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

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

希望对您有所帮助。

原始答案

好吧,我觉得这个问题没有得到足够详细的回答。

显示的消息是

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

调试器指出了一个可能的断点,可以帮助您调试情况。现在虽然这个断点确实对调试情况没有什么帮助。我认为了解如何将该断点添加到调试器很重要,因此我花时间修改它(在搜索互联网但一无所获之后),直到我让它因该错误而中断。

在所有错误上中断并没有捕捉到这一点有点烦人,但这里是将断点添加到调试器的步骤。

您要做的第一件事是选择调试器的断点导航器

navigator toolbar

通过单击此选项卡

breakpoint button

接下来,您看向导航器 Pane 的底部,然后按加号按钮

Add Exception Breakpoint

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

我选择了一个 C++ 断点并将消息名称输入到名称文本字段中。

Adding custom C++ exception

添加此异常后,它确实中断了。

然而,这可能对您作为 Objective C 开发人员有用,也可能没有用。这闯入了汇编代码。

assembly code at achieved breakpoint.

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

Thread list

后来发现autorelease问题是因为在dispatch_once调用中调用了一个名为autorelease的类。进一步调查显示 +(void)load;类上的方法在其他任何事情之前被调用。这是通过 call_load_methods 函数完成的,并且在 main 方法的线程之外。

Error Call and Stack

为了纠正这个问题,我只是在调用周围添加了自动释放池包装器。

updated error call

另一种解决方案可能是在 +(void)load 中添加自动释放池;方法。但这对我的用途来说已经足够了。

注意:我将此添加到此处的帖子中,因为我不喜欢发现问题并且无法找出通往结果答案的所有路径。如果调试器告诉您向列出的函数添加断点,那么某处应该有一些信息可以获取该信息。希望这会减少一些试图找到这个答案的人的挫败感。

关于objective-c - 断点指向 "objc_autoreleaseNoPool",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10003962/

相关文章:

ios - 使用动画设置 setContentOffset 时,UITextView 大字体文本消失

ios - 一个 Storyboard多个 viewController 或多个 Storyboard每个都有一个 viewController 哪个更可取?

ios - 在 IB 中将类分配给 VC 会导致黑屏

ios - 发送 NSMutableURLRequest 时如何在 objective-c 中使用代理服务器?

objective-c - 如果需要委托(delegate)函数,如何直接返回NSURLConnection加载的数据?

iphone - 尝试通过代码在我的 UISegmentController 中选择 segmentIndex

iOS - UITableView 的 UIRefreshControl 与 UITableViewController 的 UIRefreshControl

ios - NSObjectNotAvailableException - 无法连接到 SimulatorBridge

xcode - 在 UserDefaults 中存储 Int64

ios - 将 Swift 集成到 Objective-C 应用程序