zoukankan      html  css  js  c++  java
  • 单例模式

    什么是单例模式

    • 单例模式 是一个类在系统中只有一个实例对象。通过全局的一个入口点对这个实例对象进行访问。在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
    

     

  • 相关阅读:
    洛谷P1258小车问题
    洛谷P1028 数的计算
    P1980 计数问题
    洛谷P1907口算练习题
    2018icpc沈阳-K.Let the Flames Begin (约瑟夫环问题)
    Codeforces Round #585 (Div. 2) B. The Number of Products
    字符串部分模板总结
    CF-1209D Cow and Snacks (并查集,图)
    Codeforces Round #584 (div.1+div.2)(补题)
    HDU
  • 原文地址:https://www.cnblogs.com/wxdonly/p/5097511.html
Copyright © 2011-2022 走看看