我有一个旧应用程序,我转换为使用 ARC。原始版本没有内存泄漏,我使用调试器中的内存诊断修复了转换后的所有错误。有时,应用程序会崩溃,并且堆栈跟踪看起来像 ARC 卡在无限的保留或释放周期中,如下所示:
0 CoreFoundation 0x329046a6 CFRelease + 46
1 CoreFoundation 0x329046da CFRelease + 98
2 CoreFoundation 0x329046da CFRelease + 98
3 CoreFoundation 0x329046da CFRelease + 98
4 CoreFoundation 0x329046da CFRelease + 98
不幸的是,堆栈跟踪在 512 个条目处被切断,所以我看不到这条链从哪里开始。Apple 表示,如果 alloc 和 init 方法分开并且 init 方法返回与 alloc 不同的对象,则可能会发生这种情况。我检查了我们所有的分配,它们遵循推荐的格式:
Class *var = [[Class alloc] initMethod:arg];
有没有人见过这种无限循环?我在使用 Xcode 调试器时一直无法捕捉到它,而且非常不一致。由于 ARC 正在注入保留和释放,我不知道崩溃的起源。