美文网首页
单例设计

单例设计

作者: 黄定师 | 来源:发表于2019-05-12 11:14 被阅读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中单例创建时不严格造成的问题和解决方法

    相关文章

      网友评论

          本文标题:单例设计

          本文链接:https://www.haomeiwen.com/subject/cfaqaqtx.html