2

我有一个旧应用程序,我转换为使用 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 正在注入保留和释放,我不知道崩溃的起源。

4

0 回答 0