iOS设计模式之单利(Singleton)

介绍

单利是一种设计模式,就是在应用程序生命周期中,只会创建一个对象实例。在保存用户的信息、数据管理者等需要使用到单利。系统也有一些单利的例子:UIApplicationNSUserDefaults等。

创建方法

  • 利用GCD创建
static Signleton *signleton = nil;

+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        signleton = [super allocWithZone:zone];
    });
    return signleton;
}

+ (Signleton *)shareSignleton
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        signleton = [[self alloc] init];
    });
    return signleton;
}

+ (id)copyWithZone:(struct _NSZone *)zone
{
    return signleton;
}

+ (id)mutableCopyWithZone:(struct _NSZone *)zone
{
    return signleton;
}
  • 还有就是普通的创建
static Signleton *signleton = nil;

+ (Signleton *)shareSignleton
{
    //这里加锁是因为防止多线程同时调用
    @synchronized(self) {
        if (!signleton) {
            signleton = [[self alloc] init];
        }
        return signleton;
    }
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
    @synchronized(self) {
        if (!signleton) {
            //调用父类分配内存空间
            signleton = [super allocWithZone:zone];
        }
        return signleton;
    }
}

+ (id)copyWithZone:(struct _NSZone *)zone
{
    return signleton;
}

+ (id)mutableCopyWithZone:(struct _NSZone *)zone
{
    return signleton;
}

// MRC情况下,需要额外写以下方法
- (oneway void)release
{
    
}

- (NSUInteger)retainCount
{
    return INT32_MAX;
}

- (instancetype)autorelease
{
    return signleton;
}

- (instancetype)retain
{
    return signleton;
}

你可能感兴趣的:(iOS设计模式之单利(Singleton))