This is a singleton class for iOS, Objective-C, Cocoa Touch, iPhone, iPad.
KLSingleton is:
- Subclassible (to the n-th degree)
- ARC compatible
- Safe with
alloc
andinit
- Thread-safe
- Lock-free (uses +initialize, not @synchronize)
- Macro-free
- Swizzle-free
- Simple
This implementation chooses the singleton philosophy of "not lazy" instead of "requires explicit initialization" or "locks to allocate".
- Add the files to your project
- Import the header using
#import "KLSingleton.h"
- Subclass the KLSingleton class in the following way:
@interface MYSubclass : KLSingleton
You may then retrieve the unique, ready-to-use instance of your class by calling any of the following methods:
[MYSubclass instance] [MYSubclass sharedInstance] //alias [MYSubclass singleton] //alias [[MYSubclass alloc] init] //bad style, but safe to call any number of times
If you need to lazily allocate a large instance variable use dispatch_once
in the getter. You might do this if, for instance, you needed 500MB of workspace but did not want that memory to be allocated on startup.
- This has been tested on ARC only. Test on projects without ARC support.
- See if there are any meaningful differences with the swizzle method.
- Macro the options to become lazy and either "require initialization" or "lock to allocate"
- Something like
dispatch_once
that ran once for each subclass would let us be lazy for free. Per-subclass tokens?
Released under ISC (similar to 2-clause BSD)