GHUnit 在 iOS 项目中转换为 ARC 后给出 allocate_pages() 错误

Posted

技术标签:

【中文标题】GHUnit 在 iOS 项目中转换为 ARC 后给出 allocate_pages() 错误【英文标题】:GHUnit gives allocate_pages() error after conversion to ARC in iOS Project 【发布时间】:2012-05-09 08:58:46 【问题描述】:

我最近将我的 ios 项目转换为 ARC。我的项目中有两个目标。一个是应用程序本身,另一个是一组 GHUnit 测试。我有大约 200 个测试,它们在创建和修改 Core Data 对象方面做了很多工作。测试使用的核心数据存储是内存存储,一旦测试完成就会被丢弃(即它不会在任何地方持久化)。

当我的测试已经运行了一段时间(在抛出错误之前它们永远不会到达完全相同的点,但它总是围绕相同的测试)应用程序崩溃并出现 EXC_BAD_ACCESS(代码=2,地址=... )

控制台中的输出如下:

我已经按照 here in this answer 的说明进行操作,并将 GHUnit 目标的 main.m 文件设置为使用 -fno-objc-arc 编译器标志,但这似乎没有帮助。

我真的不明白这些错误是什么意思,搜索它们似乎没有帮助。我唯一的猜测是我的内存不足,但我不确定为什么或如何,考虑到 ARC 应该为我释放对象。

我真的很感激任何人可以给我解决这个问题的任何帮助!如果您有任何问题,请给我留言,我会尽快回复您!

谢谢!

【问题讨论】:

【参考方案1】:

克里斯,

首先,由于您遇到内存耗尽问题,您应该查看在 Instruments 分配工具下运行的测试。记得开启虚拟机自动快照。然后你应该在测试执行时多次标记堆。

其次,虽然这可能与 ARC 有关,但很可能与此无关。一般来说,ARC 应用程序由于可以更快地自动释放对象,因此比 MRR 应用程序占用的空间更小。迁移到具有不同选项的新编译器可能只是发现了一个预先存在的问题。

第三,因为您使用的是内存数据库,所以我的第一个测试是将其更改为 SQLite 数据库。它的占用空间要小得多。 (虽然您可能会选择稍后返回内存 DB,但我们正在尝试找出您的内存耗尽的原因。内存 DB 可以使用大量 RAM。因此,让我们考虑一下。

完成上述第 1 项和第 3 项任务后,请报告您的结果。

安德鲁

【讨论】:

谢谢!你说的内存不足是对的。我使用 Instruments 来调查原因,内存数据库变得太大了。我保留了内存数据库,但现在在 tearDownClass 方法中将 managedObjectContext 设置为 nil。现在一切正常!

以上是关于GHUnit 在 iOS 项目中转换为 ARC 后给出 allocate_pages() 错误的主要内容,如果未能解决你的问题,请参考以下文章

禁用弧后应用程序崩溃

ios单元測试之GHUnit

GHUnit:HTTPS REST 测试在 CLI 上总是失败

iOS之mrc转arc

iOS GHUnit 和核心数据

ARC 不允许将 Objective-C 指针隐式转换为“void *”