这是一个简单易用的工具,用于发现当您希望时未释放 View Controllers。
与使用 blocks 的保留周期结合使用时,这种情况非常普遍。有时很难意识到某些视图控制器永远不会被释放,因为在使用 Instruments 时它们不会显示为泄漏。
MSVCLeakHunter.h
和 MSVCLeakHunter.m
添加到 Xcode 项目中。applicationDidFinishLaunchingWithOptions:
方法)调用 +[MSVCLeakHunter install]
位置的某个位置。MSVCLeakHunter_ENABLED
设置为 1 在 MSVCLeakHunter.h
或者通过 Cocoapods 安装: pod 'MSVCLeakHunter'
MSVCLeakHunter
并运行应用程序,并且找到可能存在泄漏的视图控制器时,您将看到以下内容MSVCLeakHunter
与 ARC 和 非 ARC 项目兼容。如果您查看 MSVCLeakHunter.m
中的实现,它会非常天真。它所做的只是对每个 UIViewController 实例的一些方法进行交换(它会在视图控制器从屏幕消失时接收到 一个 viewDidDisappear:
调用),但在一定时间后没有释放。
如果发生这种情况,这并不保证视图控制器100%泄漏。例如,如果它位于一个 UITabBarController
中,当您选择另一个标签时,它可能消失,但它仍然被标签栏保留,并没有泄漏。
但这将帮助您发现,例如,您将导航控制器堆栈推向视图控制器,并且在您通过点击后退按钮弹出时不会释放。
在这种情况下,如果您有一个类似导航控制器的内容,在它以模式显示后,然后在模态关闭时整个堆栈消失,您可能需要调整 kMSVCLeakHunterDisappearAndDeallocateMaxInterval
的值(在 中查看 MSVCLeakHunter.h
)以给 MSVCLeakHunter
足够的余地以避免误报。否则,如果模态关闭时间较长,您可能会在堆栈底部看到关于控制器的可能泄漏的日志。
版权所有 © 2012 MindSnacks
遵循 Apache License 2.0(“授权协议”);除非符合本授权协议,否则不得使用本文件。您可以在以下地址获取授权协议的副本:
https://apache.ac.cn/licenses/LICENSE-2.0
除非适用法律强制要求或书面同意,否则根据本授权协议分发软件时不得附带任何形式的保证或条件,无论是明示的、隐含的或其他方式。有关授权和限制的具体表述,请参阅授权协议。