使用GCD的调度创建单例

如果您可以定位iOS 4.0或更高版本

使用GCD,是在Objective C中创建单例的最佳方式(线程安全)?

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

这是一种完全可以接受且线程安全的方法来创建您的类的实例。 它在技术上可能不是一个“单身”(因为这些对象只能有一个),但只要你使用[Foo sharedFoo]方法来访问对象,这就足够了。


instancetype

instancetype只是Objective-C的许多语言扩展中的一种,每个新版本都添加了更多的语言扩展。

知道它,爱它。

并以此为例,说明如何关注底层细节,可以让您深入了解转换Objective-C的强大新方法。

请参阅此处: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
链接地址: http://www.djcxy.com/p/78849.html

上一篇: Create singleton using GCD's dispatch

下一篇: Explicitly stating a Constructor outside the class