单例模式:单例类的标准写法 - iOS - UI基础知识总结13

IOS单例模式(Singleton)

单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

1.单例模式的要点:

  显然单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

2.单例模式的优点:

  1.实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例。
  2.灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程
 
IOS中的单例模式
  在objective-c中要实现一个单例类,至少需要做以下四个步骤:
  1、为单例对象实现一个静态实例,并初始化,然后设置成nil,
  2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
  3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实例的时候不产生一个新实例,
  4、适当实现allocWitheZone,copyWithZone,release和autorelease等方法。
下面以SingleData为例子,详细介绍单例类的创建方法:

先在.h中声明对象的创建方法(如果该类有存储数据的变量,还要写出对应的存储、修改、删除数据的方法)
#import <Foundation/Foundation.h>

@interface SingleData : NSObject

+ (SingleData *)shareSingleData;

@end


在.m中实现对象的创建方法
#import "SingleData.h"

// 该类单例对象的唯一指针
static SingleData *instance = nil;

@implementation SingleData

<span style="color:#FF0000;">// 实现单例类的类方法(自己声明的方法)</span>
+ (SingleData *)shareSingleData
{
    // 如果是第一次创建,instance必然为空,这时创建单例对象,否则直接返回指针地址(保证单例地址的唯一性)
    if (nil == instance) {
        instance = [[SingleData alloc]init];
    }
    return instance;// 不管是第几次用这个方法,只会返回第一次生成的空间地址
}

<span style="color:#FF0000;">// 如果该单例有一些需要初始化的变量,重写init方法实现</span>
- (instancetype)init
{
    if (self = [super init]) {
        // 这里往往放一些要初始化的变量,比如单例对象具有一个字典属性,那么就要在此处初始化
    };
    return self;
}

<span style="color:#FF0000;">// 该类自带的alloc方法</span>
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
    if (nil == instance) {
        instance = [super allocWithZone:zone];
    }
    return instance;// 不管是第几次用这个方法,只会返回第一次生成的空间地址
}




<span style="color:#FF0000;">// 对象遵守copying协议的时候,防止生成新空间</span>
- (id)copyWithZone:(NSZone *)zone
{
    return self;
}




// 重写copy方法,让外界在对该类进行copy的时候,不产生新的空间范围,直接返回原有的空间首地址
- (id)copy
{
    return self;
}

// 当别人对这块唯一的内存空间进行retain操作时,让该操作不起作用
- (instancetype)retain
{
    return self;
}

// 重写release方法
// 保证外界对该类的唯一一个势力对象进行release操作的时候,不让该对象被释放掉
// oneway 主要针对在多线程环境下,单向执行,没有“回滚”操作
- (oneway void)release
{
    
}

// 重写autorelease方法
- (instancetype)autorelease
{
    return self;
}

// 当外界访问这块空间的retainCount值的时候,返回一个-1或者2^64-1
// 其实就是在间接的告诉访问者,这块空间不属于你的管理范围
- (NSUInteger)retainCount
{
    return NSUIntegerMax;
}

@end


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值