单例设计

2019-05-12  本文已影响0人  黄定师

前言

单例(Singletons)在iOS开发中十分常见,比如系统的UIApplication,NSFileManager等均采用单例设计模式。在项目中,对很多全局共享的信息,我们也经常采用单例实现。虽然它们用起来十分方便,但实际上它们有许多问题需要注意。

按照《设计模式》书中的定义:单例模式是保证一个类仅有一个实例,并提供一个全局访问点去访问它。


单例实现

下面的代码主要解决的问题是:如果调用者不按照你的套路调用sharedInstance,而是调用new,alloc等方法获取实例,也要保证它们获取的是同一个实例,即一个类仅有一个实例

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface HDSingleTon : NSObject

+ (instancetype)sharedInstance;

@end

NS_ASSUME_NONNULL_END



#import "HDSingleTon.h"

@implementation HDSingleTon

static id sharedInstance;

+ (instancetype)sharedInstance {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc]init];
    });
    return sharedInstance;
    
    // 不采用下面这种方式:主要是防止每次调用shardInstance都进入allocWithZone,节省点资源
    //    return [[self alloc]init];
}

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

// 防止copy出新的实例
- (id)copyWithZone:(NSZone *)zone {
    return sharedInstance;
}

// 防止mutableCopy出新的实例
- (id)mutableCopyWithZone:(NSZone *)zone {
    return sharedInstance;
}

@end



参考文献

iOS单例的精心设计历程
iOS中单例创建时不严格造成的问题和解决方法

上一篇下一篇

猜你喜欢

热点阅读