虽然在ARC(与Swift)中出现的概率很低,但内存管理错误还是有可能出现的,程序员会错误地认为这种问题不会发生。经验表明,你应该尽可能使用每一个工具来找出可能的内存管理错误。下面就列出一些工具(参见第9章):
·在应用运行时,你可以通过调试导航器图表中的内存使用仪表盘来观测可能出现的内存泄漏或其他不太合理的大量内存使用情况。值得注意的是,模拟器中的内存使用不一定会反映出实际情况!当在设备上运行应用时,请密切关注内存使用仪表盘,然后再决定下一步动作。
·Instruments(Product→Profile)提供了很多优秀的工具来检测内存泄漏并追踪每个对象的内存使用情况。
·原始调试有助于确保对象的行为与预期一致。请通过一个print调用来实现deinit。如果它没有被调用,那就说明对象并没有销毁。这可能会发现连Instruments都无法直接探测到的问题。
·野指针是难以追踪的,不过可以通过“打开zombies”定位它们。可以通过Instruments中的Zombies模板轻松做到这一点。此外,还可以编辑方案中的Run动作,切换至Diagnostics页签,然后勾选上Enable Zombie Objects。结果就是不会再有对象销毁;相反,它会被“zombie”所代替,如果向其发送了消息,那么它就会向控制台打印出消息(“message sent to deallocated instance”)。不过,在追踪完野指针后,请记得关闭zombies。不要同时使用zombies与Leaks instrument:zombies会导致内存泄漏。
虽然介绍了这么多工具,但它们也无法解决每一个潜在的内存管理问题。比如,一些对象本身(如包含了一张很大图片的UIView)很小(可能导致内存管理仪表盘或Instruments并不会认为它们使用了大量内存),但却需要很大的一块存储空间;维护太多对这种对象的引用会导致应用很快就被系统杀死。这种问题是很难追踪的。