ObjC 对象内存分析/解析 iOS 128kB 限制

ObjC Object Memory Profiling / Parse iOS 128kB Limit

我有一个 Parse 拒绝让我保存的对象,因为它有 128kB 的限制...跟随这个方便的 SO post:Checking the size of an object in Objective-C,我能够输出大小我所讨论的对象的大小为 144(malloc_size 未具体说明其单位,但我假设为字节)。如果以 kB 为单位,我的对象确实超过了 128kB 的限制。但是,这个对象永远不应该在 kB 范围内——它是两个指针和三个 NSNumber(用作布尔值)...即使在 64 位系统上允许对象开销和过度分配,我们仍然在 200 字节范围——考虑到 Parse 的开销,我们可以安全地说 1kB。仍然......远小于 128kB。

具体错误是:Error: The object is too large -- should be less than 128 kB. (Code: 116, Version: 1.5.0)

这让我开始思考 -- 有哪些好的测试工具或调试此类问题的日志语句?我最熟悉 Apple 包含的分析器和标准 C/C++ 工具,如 Valgrind,但我不确定对特定对象的内存自省来判断哪个属性正在占用其 RAM...

更具体到上面列出的项目 -- Parse 采用了什么样的技巧,三个 NSNumbers 和两个指针在保存时占用 128kB,我该如何调试它?

调试对象大小大小的一种简单方法就在 Xcode 内部,在 运行 时间有断点。在尝试保存之前,使用断点检查内存中的对象大小。您还可以通过一系列虚拟对象按组件分解对象,以单独获取它们的大小。

对于那些寻找 Parse 为何会出现此错误的答案的人 -- 答案是 Parse 中存在错误。我采纳了 Ryan 的建议并使用断点进行了额外调试,对象的大小确实远不及 Parse 声称的大小。

我清除了 Parse 数据库——错误全面消失,此后没有再出现。

对于那些希望进行性能分析的人来说,Apple 的内置性能分析器是一个很好的起点(产品 -> 配置文件 -> 分配)——之后,从 link 输出特定成员变量的内存大小在原始问题中,然后当所有其他方法都失败时,在 LLVM 的控制台中使用断点和打印大小。

不幸的是,我一直无法找到一种更自动化的方式来完成所有这些工作。

希望这对以后的人有所帮助。