LifetimeTracker
![]() |
![]() |
|
---|---|---|
Bar style | Circular style |
LifetimeTracker can surface retain cycle / memory issues right as you develop your application, and it will surface them to you immediately, so you can find them with more ease.
Instruments and Memory Graph Debugger are great, but too many times, developers forget to check for issues as they close the feature implementation.
If you use those tools sporadically many of the issues they surface will require you to investigate the cause and cost you a lot of time in the process.
Other tools like FBRetainCycleDetector rely on objc runtime magic to find the problems, but that means they can't really be used for pure Swift classes. This small tool simply focuses on tracking lifetime of objects which means that it can be used in both Objective-C and Swift codebases, and it doesn't rely on any complex or automatic magic behaviour.
Installation
CocoaPods
Add pod 'LifetimeTracker'
to your Podfile.
Carthage
Add github "krzysztofzablocki/LifetimeTracker"
to your Cartfile.
Swift Package Manager
Add LifetimeTracker"
to the dependencies value of your Package.swift.
Integration
To Integrate visual notifications simply add following line at the start of AppDelegate(didFinishLaunchingWithOptions:)
or if you are using iOS 13+ SceneDelegates in scene(willConnectTo:options:)
.
Swift:
Objective-C:
You can control when the dashboard is visible: alwaysVisible
, alwaysHidden
, or visibleWithIssuesDetected
.
There are two styles available. A overlay bar view which shows the detailed list of issues directly on the screen or a circular view which displays only the amount of issues and opens the detailed list as modal view controller.
Tracking key actors
Usually, you want to use LifetimeTracker to track only key actors in your app, like ViewModels / Controllers etc. When you have more than maxCount
items alive, the tracker will let you know.
Swift
You conform to LifetimeTrackable
and call trackLifetime()
at the end of your init functions:
Objective-C
You conform to LifetimeTrackable
and call [self trackLifetime]
at the end of your init functions:
Integrating with Danger
If you are using Danger, you can use it to add both checkboxes to each PR to ensure people have verified no retain cycles were created but also to inform you when someone forgets to call trackLifetime()
function.
Surface last notification from the stack
Sometimes it is useful to get information about last retain cycle in order to log it to external sources such as analytics/trackers. In order to do that we can update initial configuration with onLeakDetected
:
Group tracked objects
You can group tracked objects together. maxCount
of a group will be calculated by maxCount
of all members per default. However, you can override it and provide a separate value to the group with groupMaxCount
.
You may want to do this when you have a set of subclasses which can appear x times each, but in total only less than the sum of all subclasses:
Writing integration tests for memory leaks
You can access the summary label using accessibility identifier LifetimeTracker.summaryLabel
, which allows you to write integration tests that end up with looking up whether any issues were found.
License
LifetimeTracker is available under the MIT license. See [LICENSE] for more information.
Attributions
I've used SwiftPlate to generate xcodeproj compatible with CocoaPods and Carthage.