@interface RootObject + (instancetype)alloc; - (instancetype)init; @end @interface BaseClass : RootObject + (instancetype)sharedInstance; - (instancetype)initWithFoo:(int)foo; @end static BaseClass *sharedInstance = (void *)0; static int counter = 0; @implementation BaseClass + (instancetype)sharedInstance { if (sharedInstance) { return sharedInstance; } sharedInstance = [[BaseClass alloc] initWithFoo:3]; return sharedInstance; } - (instancetype)initWithFoo:(int)foo { self = [super init]; if (self) { counter += foo; } return self; } @end