·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> IOS单例模式(Singleton)

IOS单例模式(Singleton)

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

转自:http://www.cnblogs.com/lyanet/archive/2013/01/11/2856468.html

 

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

1.单例模式的要点:

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

2.单例模式的优点:

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

官方如下方式实现

static MyClass *class = nil;

@implementation MyClass

+(MyClass *)sharedMyClass{

    @synchronized (self){//为了确保多线程情况下,仍然确保实体的唯一性  

        if (!class) {        

            [[self alloc] init];//非ARC模式下,该方法会调用 allocWithZone         

        }

        return class;

    }

}

 

+(id)allocWithZone:(NSZone *)zone{

    @synchronized(self){      

        if (!class) {           

            class = [super allocWithZone:zone]; //确保使用同一块内存地址           

            return class;           

        }       

        return nil;

    }

}

 

- (id)init;

{

    @synchronized(self) {       

        if (self = [super init]){           

            return self;

        }       

        return nil;

    }

}

 

- (id)copyWithZone:(NSZone *)zone;{   

    return self; //确保copy对象也是唯一   

}

 

-(id)retain{   

    return self; //确保计数唯一  

}

 

- (unsigned)retainCount

    return UINT_MAX;  //装逼用的,这样打印出来的计数永远为-1  

}

 

 

- (id)autorelease

{   

    return self;//确保计数唯一   

 

- (oneway void)release

{   

    //重写计数释放方法  

}

 

再调试

MyClass *A = [[MyClassalloc] init];

NSLog(@"A:%@",A);

MyClass *B = [MyClasssharedMyClass];

NSLog(@"B:%@",B);

MyClass *C = [A copy];

NSLog(@"C:%@",C);

 

打印出的是

 

A:<MyClass: 0x6a1e130>

B:<MyClass: 0x6a1e130>

C:<MyClass: 0x6a1e130>

都是指向同一块内存地址

答案已经出来了

apple建议的方式显然真正的确保了实体的唯一性

 

另外一种写法是:

  1. + (AccountManager *)sharedManager  
  2. {  
  3.         static AccountManager *sharedAccountManagerInstance = nil;  
  4.         static dispatch_once_t PRedicate;  
  5.         dispatch_once(&predicate, ^{  
  6.                 sharedAccountManagerInstance = [[self alloc] init];   
  7.         });  
  8.     return sharedAccountManagerInstance;  
  9. }

     该写法具有以下几个特性:

    1. 线程安全。

    2. 满足静态分析器的要求。

    3. 兼容了ARC