From https://stackoverflow.com/questions/7034971/singleton-pattern-in-objc-how-to-keep-init-private Throw an exception in init - (instancetype)init { [self doesNotRecognizeSelector:_cmd]; return nil; } - (instancetype)initPrivate { self = [super init]; if (self) { } return self; } + (instancetype)sharedInstance { static MySingleton *sharedInstance; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedInstance = [[self alloc] initPrivate]; }); return sharedInstance; } Have init return your singleton - (instancetype)init { return [[self class] sharedInstance]; } - (instancetype)initPrivate { self = [super init]; if (self) { } return self; } + (instancetype)sharedInstance { static MySingleton2 *sharedInstance; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedInstance = [[self alloc] initPrivate]; }); return sharedInstance; }