单例设计模式

{

1.单例简介:

作用:

保证程序在运行过程中,一个类只有一个实例对象.这个实例对象容易被外界访问!

控制实例对象个数(只有一个),节约系统资源.

使用场合:

在整个应用程序中,共享一份资源(这份资源只需要创建初始化一次).

举例:

打印机/视图窗口/一些网络工具类等等

//懒汉式:用到的时候再加载.

//饿汉式:只要程序运行就加载. //不需要掌握,也不要这么写!

//掌握懒汉式.

2.单例实现:(两种方式:互斥锁(@synchronized(self))和一次性代码(dispatch_once));

2.1互斥锁@synchronized(self):

<1>.在.m文件中保留一个全局的static的实例.

staticid_instance;

<2>.重写若干方法(allocWithZone:和copyWithZone:)并提供一个类方法让外界访问唯一的实例.

//(1)重写allocWithZone:方法,在这里创建唯一的实例(注意线程安全). //alloc内部都会调用这个方法.

+(instancetype)allocWithZone:(struct_NSZone *)zone {

if(_instance ==nil) {//防止频繁加锁

@synchronized(self) {

if(_instance ==nil) {//防止创建多次

_instance = [superallocWithZone:zone];

}

}

}

return_instance;

}

//(2)重写copyWithZone:方法.

+(id)copyWithZone:(struct_NSZone *)zone

{

return_instance;

}

//(3)提供1个类方法让外界访问唯一的实例

+(instancetype)shareSingleton

{

if(!_instance) {//防止频繁加锁

@synchronized(self){

if(!_instance) {//防止创建多次

_instance = [[selfalloc] init];

}

}

}

return_instance;

}

2.2一次性代码(dispatch_once):

<1>.在.m文件中保留一个全局的static的实例.

staticid_instance;

<2>.重写若干方法(allocWithZone:和copyWithZone:)并提供一个类方法让外界访问唯一的实例.

//(1)重写allocWithZone:方法,在这里创建唯一的实例(注意线程安全).

+ (id)allocWithZone:(struct_NSZone *)zone

{

staticdispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

_instace = [superallocWithZone:zone];

});

return_instace;

}

//(2)重写copyWithZone:方法.

+(id)copyWithZone:(struct_NSZone *)zone

{

return_instance;

}

//(3)提供1个类方法让外界访问唯一的实例

+ (instancetype)shareSingleton

{

staticdispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

_instace = [[selfalloc] init];

});

return_instace;

}

注意:在ARC和MRC中单例的实现方式略有不同. MRC下单例的实现比ARC多了几个内存管理的方法:

MRC中增加如下方法的实现:

- (instancetype)retain {returnself; }

- (NSUInteger)retainCount {return1; }

- (onewayvoid)release {}

- (instancetype)autorelease {returnself; }

3.判断当前环境(ARC/MRC)

#if __has_feature(objc_arc)

// ARC

#else

// MRC

#endif

4.注意两个方法:

//面试问题:两个方法的区别?

<1> +(void)load;

//当类加载到OC运行时环境(内 存)中的时候,就会调用一次(一个类只会加载一次).

//程序一启动就会调用.

//程序运行过程中,只会调用1次.

<2> +(void)initialize;

//当第一次使用这个类的时候(比如调用了类的某个方法)才会调用.

//并非程序一启动就会调用.

}

单例设计模式_第1张图片
单例设计模式_第2张图片

你可能感兴趣的:(单例设计模式)