美文网首页
单例(singleTon)

单例(singleTon)

作者: Zz橙淞 | 来源:发表于2017-03-17 18:12 被阅读0次

单例

单例模式的意图就是使得类中的一个对象成为系统中的唯一实例。它提供了对类的对象所提供的资源的全局访问点。因此需要用一种只允许生成对象类的唯一实例的机制。下面让我们来看下单例的作用:
可以保证的程序运行过程,一个类只有一个示例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约系统资源。

  • 单例模式的使用场合
    类只能有一个实例,并且必须从一个为人数值的访问点对其访问。
    这个唯一的实例只能通过子类化进行拓展,并且拓展的对象不会破坏客户端代码。

单例的实现

SingleTonTest.h中
#import <Foundation/Foundation.h>

  @interface SingleTonTest : NSObject

  //单例中的属性
  @property(nonatomic,copy)NSString *sendStr;
  @property (strong, nonatomic)   NSMutableArray  *arrayM;

  +(SingleTonTest *)sharedSingleTon;

  @end

SingleTonTest.m中
#import "SingleTonTest.h"

 static SingleTonTest *singleTon = nil;

 @implementation SingleTonTest

//经典方式
//+(SingleTonTest *)currentUser
//{
//    if(singleTon == nil){
//        
//      singleTon = [[self.class alloc]init];
//        
//    }
//    return singleTon;
//}


//GCD方式(建议使用)
+(SingleTonTest *)sharedSingleTon{

    static dispatch_once_t onceTocken;
    dispatch_once(&onceTocken,^{
    
    if (!singleTon) {
        singleTon = [[SingleTonTest alloc]init];
    }
});

return singleTon;
}

//重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实例的时候不产生一个新实例,
+(id)allocWithZone:(NSZone *)zone{

@synchronized(self){
    
    if (!singleTon) {
        
        singleTon = [super allocWithZone:zone]; //确保使用同一块内存地址
        return singleTon;
    }
    return nil;
}
}

//自定义初始化方法
 - (instancetype)init
{
    self = [super init];
    if(self){
        self.sendStr = @"Singleton";
        self.arrayM = [[NSMutableArray alloc] init];
    }
    return self;
 }

 //重写该方法主要确保当用户通过copy方法产生对象时对象的唯一性
- (id)copy
{
     return self;
 }    
  //重写该方法主要确保当用户通过mutableCopy方法产生对象时对象的唯一性
 - (id)mutableCopy
{
    return self;
}
@end

相关文章

网友评论

      本文标题:单例(singleTon)

      本文链接:https://www.haomeiwen.com/subject/laqenttx.html