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

来源:互联网 发布:mac 搜狗不能使用 编辑:程序博客网 时间:2024/06/06 20:08

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


0 0
原创粉丝点击