美文网首页
ios中单例模式的基本应用

ios中单例模式的基本应用

作者: 随风_8cc2 | 来源:发表于2018-04-24 21:41 被阅读0次

ARC(自动内存管理)下实现单例模式###前言开发过程中,遇到一种情况:需要多次用到某个类,每次创建都会分配新的内存地址。但是,在某些场合这是没有必要的。>如播放音乐,一般不会说,开一个播放器同时播放多首歌。而且,系统的资源是有限的,特别是移动设备。所以 ‘ 单例模式 ’ 应运而生。###简介单例模式:在程序运行过程中,一个类只有一个实例。而且该实例易于供外界使用。换句话说,一个类无论创建多少次,都只分配一次存储空间。###目的为了在程序运行过程中,共享一份资源,且这份资源只会初始化一次,只分配一次存储空间,从而节约系统资源。###好处节约系统资源。###实现步骤以PDuser类为例1、定义静态变量,存储唯一实例```static PDuser *_instance;```这样,外面就不能获取到这个实例变量,只能在本文件中访问。2、重写`allocWithZone `方法,在里面用一次性代码函数`dispatch_once `,并调用`super allocWithZone`方法```+ (instancetype)allocWithZone:(struct _NSZone *)zone{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [super allocWithZone:zone]; }); return _instance;}```这一步,也可以用懒加载的方式来做:```+ (instancetype)allocWithZone:(struct _NSZone *)zone{ // 考虑到使用时可能在多条线程同时执行此方法任务,那么就可能引发线程安全问题,所以需要对线程进行加锁操作 @synchronized(self) { if (_instance == nil) { _instance = [super allocWithZone:zone]; } } return _instance;}```3、实现类方法```+(instancetype)shareUser{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [[self alloc] init]; }); return _instance;}```> new方法:分配内存并且初始化alloc:为对象分配内存,init:初始化对象中的属性等4、外界调用方法提供一个类方法,获取单例对象,方便创建。`+ (instancetype)shareUser;`至此,基本的单例已经实现。下面可以再继续完善。***5、处理copy的情况(可选)为了让单例严谨一点,如果要支持copy,则重写copy和mutableCopy。直接返回变量即可,因为只有创建了对象,才能使用copy方法。> 先遵守协议```

- (id)copyWithZone:(NSZone *)zone

{

    return _instance;

}

- (id)mutableCopyWithZone:(NSZone *)zone

{

    return _instance;

}

```

- 注意 : 使用单例模式设计的类,不可继承!

###单例命名格式

牵扯到命名的问题,怎样命名才规范?单例常见的命名形式有这几种:share 、share + 类名 、default、default + 类名

###适用场景

在整个程序中,都可以共享同一份资源——这份资源只需创建初始化一次,只分配一次存储空间即可。

例如:用户实例、文件管理者等。

###测试

创建3个对象

```

    PDuser *user1 = [PDuser shareUser];

    PDuser *user2 = [PDuser shareUser];

    PDuser *user3 = [PDuser shareUser];

    NSLog(@"user1:%@\nuser2:%@\nuser3:%@",user1,user2,user3);

```

结果

![QQ.png](https://img.haomeiwen.com/i6430368/48dc928ee23a810f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

成功

###宏定义

若要实现单例代码复用,不能用继承。用宏,把单例模式抽取出来。

新建一个.h文件Single.h,其中包含两个部分,即.h和.m部分

把具体的类类型,改成id 类型,并设置参数(name)类名,用##连接,使用时,外界的类可以灵活变换。另外,.m中的代码用多个"\"号连接起来。

![QQ.png](https://img.haomeiwen.com/i6430368/83573128ed310b49.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

外界使用:

在新建的某个类的.h中,注意带上参数 类名

![QQ.png](https://img.haomeiwen.com/i6430368/379e794d5696bdda.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

.m中

![QQ.png](https://img.haomeiwen.com/i6430368/79fda8f844b47d5a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

即可

###相关资料

https://www.jianshu.com/p/5226bc8ed784

相关文章

  • iOS 单例模式

    关于单例模式的详解,看完这几篇,就完全了然了。iOS 单例模式iOS中的单例模式iOS单例的写法

  • (IOS)单例

    概述 单例模式在IOS中的应用非常广泛,如[NSNotificationCenter defaultCenter]...

  • 单例

    iOS单例模式iOS之单例模式初探iOS单例详解

  • iOS知识梳理3:设计模式

    iOS有哪些常见的设计模式?单例模式/委托模式/观察者模式/MVC模式 单例模式 单例保证了应用程序的生命周期内仅...

  • 单例模式 Singleton Pattern

    单例模式-菜鸟教程 iOS中的设计模式——单例(Singleton) iOS-单例模式写一次就够了 如何正确地写出...

  • 设计模式01--单例模式(创建型模式)

    设计模式--单例模式 概念: 目的: 基本模式有23种。 单例模式: 保证整个应用中某个实例有且只有一个。常用的有...

  • ios中单例模式的基本应用

    ARC(自动内存管理)下实现单例模式###前言开发过程中,遇到一种情况:需要多次用到某个类,每次创建都会分配新的内...

  • iOS中单例模式的基本应用

    ARC(自动内存管理)下实现单例模式 前言 开发过程中,遇到一种情况:需要多次用到某个类,每次创建都会分配新的内存...

  • 设计模式:单例

    单例模式的基本介绍单例模式的实现源码中的单例模式记录 单例模式的基本介绍 定义:确保一个类只有一个实例,自行实例化...

  • 为什么使用dispatch_once_t简单理解

    通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。在iOS中单例模式实现方式...

网友评论

      本文标题:ios中单例模式的基本应用

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