美文网首页
单例设计模式

单例设计模式

作者: 帥陽 | 来源:发表于2017-02-08 15:39 被阅读3次

{

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;

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

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

}

相关文章

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • python中OOP的单例

    目录 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 单例

    目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • python 单例

    仅用学习参考 目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计...

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • 设计模式第二篇、单例设计模式

    目录1、什么是单例设计模式2、单例设计模式的简单实现3、单例设计模式面临的两个问题及其完整实现4、单例设计模式的应...

  • 设计模式 - 单例模式

    设计模式 - 单例模式 什么是单例模式 单例模式属于创建型模式,是设计模式中比较简单的模式。在单例模式中,单一的类...

  • 2、创建型设计模式-单例设计模式

    江湖传言里的设计模式-单例设计模式 简介:什么是单例设计模式和应用 备注:面试重点考查 单例设计模式:这个是最简单...

  • 设计模式之单例模式

    单例设计模式全解析 在学习设计模式时,单例设计模式应该是学习的第一个设计模式,单例设计模式也是“公认”最简单的设计...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

网友评论

      本文标题:单例设计模式

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