New Info
我通过创建一个混合自动释放方法来确定我的问题所在。
我不建议这样做,除非你知道自己在做什么,但这就是我发现的。
+ (void) load; //Method is called outside the original autorelease pool.
+ (void) initialize; // Method is called outside the original autorelease pool.
NSThread 创建自己的线程,被调用的方法应该包装在自动释放池中。
当使用“dispatch_...”命令时,Grand Central Dispatch 负责调整自动释放池。但是,当您手动调度时。您可能想将其包装在自动释放池中。
此外,ARC 不会让您知道自动释放将在池外发生。
因此,如果您使用 ARC 并且知道您将位于自动释放池之外。你对此无能为力。您将希望避免所有方便的方法。
用这个。
[[NSString alloc] initWithFormat:@"%@",myObject];
而不是这个
[NSString stringWithFormat:@"%@",myObject];
这将允许弧系统保留和释放,但将跳过便利方法完成的底层自动释放,因为您不会使用便利方法。
希望有帮助。
原答案
好吧,我觉得这个问题没有得到足够详细的回答。
所传达的信息是
objc[1310]: Object 0x34f720 of class SimpleKeychain autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
调试器会指出一个可能的断点,以帮助您调试情况。现在,虽然这个断点确实对调试情况没有什么帮助。我认为知道如何将该断点添加到调试器中很重要,因此我花了时间修补它(在搜索互联网并一无所获之后),直到我让它在该错误上中断。
令人烦恼的是,所有错误上的中断都无法捕获此问题,但以下是将断点添加到调试器的步骤。
您要做的第一件事是选择调试器的断点导航器
单击此选项卡
接下来,您看向导航器窗格的底部并按加号按钮
这将允许您手动添加断点。
我选择了一个 C++ 断点,并将消息名称输入到名称文本字段中。
添加此异常后,它实际上确实中断了。
然而,这对于作为 Objective C 开发人员的您可能有用,也可能没有用。这侵入了汇编代码。
不幸的是,它只在线程的调用堆栈上显示了这一点。
结果发现,autorelease问题是因为在dispatch_once调用中调用了一个名为autorelease的类。进一步调查显示+(void)load;类上的方法在其他任何事情之前被调用。这是通过 call_load_methods 函数完成的,并且位于 main 方法的线程之外。
为了纠正这个问题,我只是在调用周围添加了自动释放池包装器。
另一种解决方案可能是在 +(void)load 内添加自动释放池;方法。但这对于我的使用来说已经足够了。
注意:我将其添加到此处的帖子中是因为我不喜欢发现问题并且无法找出最终答案的所有路径。如果调试器告诉您向列出的函数添加断点,那么应该有一些信息可以获取该信息。希望这能减少一些试图寻找答案的人的挫败感。