Skip to content

cocoaplayground/HeapInspector-for-iOS

 
 

Repository files navigation

HeapInspector

Find memory issues & leaks in your iOS app

Build Status Cocoapods Version CocoaPods Platform

HeapInspector is an iOS debug tool that monitors the memory heap in your app. You can discover memory leaks, no longer needed living objects and more issues directly on your device without ever starting Instruments.

Memory heap snapshots

Basically you can inspect the entire heap and see all living objects of your iOS app.
To be more precise you can record the heap for a specific part of the app. For instance when navigating through the menu. Like in Apple's Instruments the snapshot compares the heap before you started recording. For instance you can start the snapshot before you push a new UIViewController onto your UINavigationController stack and stop after popping the UIViewController. With HeapInspector and heap snapshots you can identify:

  • Leaking objects
  • Retain cycles
  • Living objects that are no longer needed
  • static objects like singletons or cached UIImage
  • Dirty memory and your objects on the heap

HeapInspector gives you detailed information for the living objects:

  • Reference history (see who called retain, strong, release) for NSObject subclasses
  • Responder chain for recorded objects
  • Screenshots of the inspected UIView, UIViewController, UIImage
  • Detailed information about the object (Description, frame, properties, iVars, methods)

In Action

HeapInspector

Why

Since ARC has been introduced we don't need to manage the retain & release anymore. ARC is very powerful and makes Objective C more stable. ARC decreased the number of crashes and improves the memory footprint.
ARC is technically doing a powerful job. It knows when to retain, autorelease and release.
But ARC doesn't think about the overall architecture how to design for low memory usage. You should be aware that you can still do a lot of things wrong with your memory (even with ARC). You can still get memory pressures or peaks with ARC.

  • You can still create Retain Cycles
  • The strong property lifetime qualifier can be misused (i.e. holding an object twice and longer than needed.)
  • Memory peaks through loops (if you're not using a proper @autoreleasepool)
  • Wrong caching with static

And that's why we introduced HeapInspector to find those issues.

Installation

CocoaPods

Just add the HeapInspector to your Podfile.

pod 'HeapInspector'

and run pod install afterwards.

Without CocoaPods

Download the repository into your project via git or just as zip. Drag it the HeapInspector folder into your Xcode project. See following image.

Disable ARC for NSObject+HeapInspector.m by adding -fno-objc-arc to XCode's Build Phases -> Compile Source. See example images here: Drag and disable ARC

How to use it

Make sure to import the heder file

#import "HINSPDebug.h"

Start

Just run the following to start HeapInspector in a separated debug window. The window can be moved on your screen in order to reach all your UI elements. The left circle button starts / stops the memory heap snapshot. See demo above.

[HINSPDebug startWithClassPrefix:@"RM"];

The prefix can be nil. No prefix will record all NSObject subclasses. We recommend to use a specific class prefix or even better a real class like UIImageView.

Stop

Stopping and removing the inspector's window goes with

[HINSPDebug stop];

Just call the start/stop methods at app launch or via your custom button.

Backtrace record

HeapInspector can also record the backtrace for each object that received an alloc, retain, release or dealloc. Notice: This has a large performance impact. Use this only with very specific recorded classes or small apps. Start the backtrace with

[HINSPDebug recordBacktraces:YES]; 

Example project

HeapInspector comes with an example project. There you will see a lot of mistakes made with the memory design.

  • strong delegate properties
  • NSTimer that is not being invalidated properly
  • Holding objects longer than needed. strong property for the UIViewController that is pushed onto the UINavigationController stack

Todo

  • Test with Swift

License

MIT

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Objective-C 85.5%
  • Shell 7.8%
  • Ruby 3.9%
  • C 1.4%
  • C++ 1.4%