Friday, February 4, 2011

Objective-C Semi-Singleton Class

Sometimes when building an iOS application, you will have a class you will want to access from anywhere. Such as, a controller with any number of child controllers (navigation, tab, etc.) and some of them need simple access back to the root controller.

Apple provides their own solution to creating a full-blown singleton class, but this can be a daunting task for a simple need. A semi-singleton is much easier to create but has two caveats:

1) semi-singletons only work if there is ever only one instance of the class
2) the singleton cannot be used to initialize itself

So, here is how to make a simple "HelloWorld" class into a semi-singleton.

In the HelloWorld.m file, create a static property to hold the singleton instance:


// put just after @implementation line
static HelloWorld* helloWorldInstance;


in the init method, assign the instance (self) to the static property:


-(id) init
{
if ((self = [super init]))
{
// assign the semi-singleton
helloWorldInstance = self;
// do other init stuff here ...
}
return self;
}


create the shared static method for accessing the semi-singleton:


+(HelloWorld*) sharedInstance {
return helloWorldInstance;
}


Lastly, be sure to dealloc the property to avoid crashes:


-(void) dealloc
{
helloWorldInstance = nil;
[super dealloc];
}


And now from any class, we can access a pointer to the instance:


#import HelloWorld.h

HelloWorld *helloWorld = [HelloWorld sharedInstance];


And there you have it. Thanks to Steffen Itterheim and his book about cocos2d programming for the original tip!