I read a couple of amazing resources on singletons in Obj-C:
To make the init/new methods unavailable for callers of your singleton class you could use the NS_UNAVAILABLE macro in your header file:
- (id)init NS_UNAVAILABLE; + (id)new NS_UNAVAILABLE; + (instancetype)sharedInstance;