美文网首页
iOS开发 单例 深入探究

iOS开发 单例 深入探究

作者: 宇宙无敌大强子 | 来源:发表于2021-06-22 14:50 被阅读0次

    一、单例的定义

    在程序的整个运行过程中,只创建一个对象实例,内存地址一直不变,就叫做单例。


    单例模式图示

    二、iOS中的单例

    cocoa框架中常用的是:

    • UIApplication
    • NSNotificationCenter
    • NSFileManager
    • NSUserDefaults
    • NSURLCache

    三、单例模式的优缺点

    优点:

    1.减少内存开支(对象需要频繁的创建和销毁)
    2.减少系统的性能开销
    3.避免对同一资源的同时读写操作,优化和共享资源访问

    缺点:

    1.没有抽象层,扩展困难,想要扩展就必须要修改代码
    2.职责太重,违背了“单一职责原则”
    3.在多线程中使用单例,需要多该单例成员进行线程互斥处理

    四、自定义一个单例类

    .h
    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    /// 自定义一个单例类
    @interface GQSingletonTool : NSObject
    
    /// 初始化方法
    + (instancetype)shareInstance;
    
    @end
    
    .m

    一般的写法(不完美,但是够用):

    #import "GQSingletonTool.h"
    
    @implementation GQSingletonTool
    
    + (instancetype)shareInstance {
        static GQSingletonTool *instance = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            instance = [[GQSingletonTool alloc] init];
        });
        return instance;
    }
    
    @end
    

    上面写法的缺陷,在于如果不使用规定的 shareInstance 方法来初始化,而是采用 alloc init 的话,就没法保证生成的是单例的对象了。
    完备的写法:

    #import "GQSingletonTool.h"
    
    @implementation GQSingletonTool
    
    // 初始化(单例方法)
    + (instancetype)shareInstance {
        static GQSingletonTool *instance = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            instance = [[GQSingletonTool alloc] init];
        });
        return instance;
    }
    
    + (instancetype)allocWithZone:(struct _NSZone *)zone {
        return [GQSingletonTool shareInstance];
    }
    
    + (instancetype)alloc {
        return [GQSingletonTool shareInstance];
    }
    
    - (id)copy {
        return self;
    }
    
    - (id)mutableCopy {
        return self;
    }
    
    + (id)copyWithZone:(struct _NSZone *)zone {
        return self;
    }
    
    @end
    

    相关文章

      网友评论

          本文标题:iOS开发 单例 深入探究

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