Create singleton using GCD's dispatch_once in Objective-C Create singleton using GCD's dispatch_once in Objective-C ios ios

Create singleton using GCD's dispatch_once in Objective-C


This is a perfectly acceptable and thread-safe way to create an instance of your class. It may not technically be a "singleton" (in that there can only ever be 1 of these objects), but as long as you only use the [Foo sharedFoo] method to access the object, this is good enough.


instancetype

instancetype is just one of the many language extensions to Objective-C, with more being added with each new release.

Know it, love it.

And take it as an example of how paying attention to the low-level details can give you insights into powerful new ways to transform Objective-C.

Refer here: instancetype


+ (instancetype)sharedInstance{    static dispatch_once_t once;    static id sharedInstance;    dispatch_once(&once, ^    {        sharedInstance = [self new];    });        return sharedInstance;}

+ (Class*)sharedInstance{    static dispatch_once_t once;    static Class *sharedInstance;    dispatch_once(&once, ^    {        sharedInstance = [self new];    });        return sharedInstance;}


MySingleton.h

@interface MySingleton : NSObject+(instancetype)sharedInstance;+(instancetype)alloc __attribute__((unavailable("alloc not available, call sharedInstance instead")));-(instancetype)init __attribute__((unavailable("init not available, call sharedInstance instead")));+(instancetype)new __attribute__((unavailable("new not available, call sharedInstance instead")));-(instancetype)copy __attribute__((unavailable("copy not available, call sharedInstance instead")));@end

MySingleton.m

@implementation MySingleton+(instancetype)sharedInstance {    static dispatch_once_t pred;    static id shared = nil;    dispatch_once(&pred, ^{        shared = [[super alloc] initUniqueInstance];    });    return shared;}-(instancetype)initUniqueInstance {    return [super init];}@end