• 单例模式


    什么是单例模式

    • 单例模式 是一个类在系统中只有一个实例对象。通过全局的一个入口点对这个实例对象进行访问。在iOS开发中,单例模式是非常有用的一种设计模式。

    • 可以保证在程序运行过程,一个类只有一个实例


    实现单例模式的条件

    • 实现单例模式有三个条件:

      1. 类的构造方法是私有的
      2. 类提供一个类方法用于产生对象
      3. 类中有一个私有的自己对象
    • 针对于这三个条件,OC中都是可以做到的

      1. 类的构造方法是私有的 我们只需要重写allocWithZone方法,让初始化操作只执行一次
      2. 类提供一个类方法产生对象 这个可以直接定义一个类方法
      3. 类中有一个私有的自己对象 我们可以在.m文件中定义一个属性即可

    应用场景及注意点

    • 应用场景

      • 某个类经常被使用(节约系统资源)
      • 定义工具类
      • 共享数据
    • 注意点

      • 不要继承单例类
        • 先创建子类永远是子类对象
        • 先创建父类永远是父类对象
    • 单例模式:

      • 懒汉模式 : 第一次用到单例对象的时候再创建
      • 饿汉模式 : 一进入程序就创建一个单例对象

    ARC环境下

    在.h文件中

    @interface XMGTools : NSObject<NSCopying,NSMutableCopying>

     

    //提供类方法

    /*

     01 表明身份,表明这是一个单例

     02 注意点:命名规范:share+类名|default+类名|share|类名

     */

     

    +(instancetype)shareTools;

    @end

     在.m文件中

    @implementation XMGTools

     

    static XMGTools *_instance;

     

    //重写该方法,保证永远都只分配一次空间

    +(instancetype)allocWithZone:(struct _NSZone *)zone

    {

    //    @synchronized(self) {

    //        if (_instance == nil) {

    //            _instance = [super allocWithZone:zone];

    //        }

    //    }

        

        //只会执行一次

        static dispatch_once_t onceToken;

        dispatch_once(&onceToken, ^{

            _instance = [super allocWithZone:zone];

        });

     

        

        return _instance;

    }

     

    +(instancetype)shareTools

    {

        return [[self alloc]init];

    }

     

    -(id)copyWithZone:(NSZone *)zone

    {

        return _instance;

    }

     

    -(id)mutableCopyWithZone:(NSZone *)zone

    {

        return _instance;

    }

    非ARC

    在非ARC的环境下,需要再加上下面的方法:

    • 重写release方法为空
    • 重写retain方法返回自己
    • 重写retainCount返回1
    • 重写autorelease返回自己
    - (oneway void)release { }
    - (id)retain { return self; }
    - (NSUInteger)retainCount { return 1;}
    - (id)autorelease { return self;}
    
    • 如何判断是否是ARC
    #if __has_feature(objc_arc)
    //ARC环境
    #else
    //MRC环境
    #endif
    

     

  • 相关阅读:
    sql server 存储过程分隔split
    sql server 存储过程、事务,增删改
    jquery ajax 参数可以序列化
    Pycharm连接gitlab
    gitlab的搭建和linux客户端的连接
    jenkins的搭建和使用
    svn服务器及客户端安装使用
    python2 和python3共存下问题
    Codecademy For Python学习笔记
    类编写的细节
  • 原文地址:https://www.cnblogs.com/wxdonly/p/5097511.html
Copyright © 2020-2023  润新知