单例模式

什么是单例模式

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

 

原文地址:https://www.cnblogs.com/wxdonly/p/5097511.html