MRC模式下的单例类

单例类

在整个程序的生命周期内 , 该类的对象都是唯一的 , 这个程序的生命周期结束时才能结束

iOS中的单例模式

    在objective-c中要实现一个单例类 , 至少要做到以下四个步骤:

    1、 为单例类穿件一个静态实例 , 并初始化 ,然后设置成nil;

    2、实现一个实例构造方法检查上面声明的静态实例是否为nil , 如果是则新建并返回一个本类的实例

    3、重写allocWIthZone方法 , 用来保证其他人直接使用alloc和init试图获得一个新的实例的时候不产生一个新的实例

    4、适当实现allocWithZone , copyWithZOne ,retain , retainCount,  release , 和autorelease,

// 首先先创建一个单例类

在.m文件中定义该单例对象的唯一指针

#import "Teacher.h"

static Teacher *instance = nil;  -----------------------------第一步

@implementation Teacher

// 初始化 ,得到该单例对象的唯一接口 , 也就是能得到的唯一的这个类的对象 , 保证实例对象的唯一性

+ (Teacher *)shareTeacher

{

  // 若果该单例类的指向空间不存在 , 则创建新的单例对象

     if (nil == instance) {---------------------------------第二步

      instance = [Teacher alloc] init];

     }

    return instance;

}


+ (id)allocWithZone:(NSZone *)zone      ---------------------第三步

{

//    @synchronized(self) {---------------------这个是多线程操作下的线程锁

          if (nil == instance)

         {

        instance = [super allocWithZone:zone];

        retain instance;

            }

//      }

    retain nil;

}


// 重写copy方法 , 让外界对该类进行copy的时候 , 不产生新的空间, 直接返回原空间的首地址 , 同样是为了保证实例的唯一性-----------------第四步


- (instancetype)init

{

    @synchronized(self) {-------------------- 多线程情况

      self = [super init];

      if (self) {

       // 往往放一些要初始化的变量

    }

   return self;

 }

}


- (id)copy

{

  return self;

}


- (id)copyWithZone:(NSZone *)zone

{

    return self;

}


// 重写release方法 保证外界对该类的唯一一个实例对象进行release操作的同时 , 不让该对象release掉

- (oneway void)release

{

     ;

}

// oneway 主要是真对多线程环境下的单向执行 , 没有“回滚”操作 , 也就是我们所说的原子操作

- (id)autorelease

{

   retain self;

}

// 当别人对我们这一块空间进行retain从操作的时候 , 不让该空间retain操作其效果

- (instancetype)retain

{

   return self;

}

// 当外界访问这块空间的retainCount值的时候返回 -1 , 或者2^64 - 1 , 其实就是为了告诉访问者 , 这块空间不是那么好管理的 , 你就不要管理了

- (NSUInteger)retainCount

{

   return NSUIntegerMax;

}


// 单例方法的实现 ---- 这个是最为安全的方法用GCD创建
+ (XMPPHelper *)shareXMPPHeleper
{
    static XMPPHelper *xmppHelper = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        xmppHelper = [[XMPPHelper alloc] init];
    });
    return xmppHelper;
}



swift版本的单例 , 不同的是我们这里要用到一个结构体

class NetWorkEngine: NSObject {

// 创建结构体的目的就是使用static关键字

    struct NetWorkEngineSTR {
    // 定义类属性
        static var netWorkEingine:NetWorkEngine?
        // 定义类属性
        static var onceToken:dispatch_once_t = 0
    }
    
    // 定义类方法
    class func shareNetWorkEngine()->NetWorkEngine {
        dispatch_once(&NetWorkEngineSTR.onceToken , {() -> Void in
            // 创建NetWorkEngine实例
        NetWorkEngineSTR.netWorkEingine = NetWorkEngine()
            })
        return NetWorkEngineSTR.netWorkEingine!
    }
    
}






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值