文档章节

单例模式的笔记

不孤独的美食家
 不孤独的美食家
发布于 2015/06/09 13:47
字数 750
阅读 58
收藏 0
点赞 0
评论 0

                                                 单例模式

一   使用单例模式的目的:

            保证内存中永远只有类的单个实例。

二  单例的建立方法:

      1.声明一个静态成员变量,记录唯一实例。

      2.重写allocWithZone方法,这个方法是给对象分配内存空间,最终会调用的方法,重写该方法保证只会给对象分配一个内存空间。如果考虑到多线程的情况,我们可以使用dispatch_once_t,从而保证在多线程的情况下,都只会实例化一个对象副本。

      3.建立sharedXXX类方法,这样可以便于其它类访问。

三  以卖票为例,说明建立单例的步骤

      首先在.m文件中申明一个静态成员变量,static id *sharedInstance;

重写allocWithZone方法,使用内存地址实例化对象,所有实例化方法,最终都会调用此方法,然后用一个变量记录第一个实例化出来的对象。

        +(id)allocWithZone:(NSZone*)zone

{

               static dispatch_once_t onceToken;

                   dispatch_once_t(&onceToken,^{

                     _sharedInstance=[super allocWithZone:zone];

});

            return   _sharedInstance;

}     

然后建立一个单例类方法,便于其他类调用

+(id)sharedInastance

{

                  static dispatch_once_t onceToken;

                        dispatch_once_t(&onceToken,^{

                             _sharedInstance=[[self alloc]init];

                                 });

             return _sharedInstance;

}     

注意:仅仅使用单例无法解决多线程中争夺资源的问题,使用同步锁@synchronized可以保证多个线程不会使用同一个代码块,而且比NSLock具有更好的性能。其次,为了保证属性安全,被争夺的资源的这个属性应该设置为原子属性atomic.但是,使用  原子属性atomic会降低系统的性能。

                                单例的完善--GCD方式单例

一        如果我们在一个类想在另一个类访问它的全局变量,可使用extern,引用某个全局变量(并非定义),例如:extern id _instance;

二        对static的理解

    static修饰去全局变量,则全局变量的作用域仅限于当前文件内部。当我们在声明全局变量的时候,尽量使用static,这样可以防止被其他文件恶意修改。

  +(id)allocWithZone:(NSZone*)zone

{

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

                {

                   @synchronized(self)

                     {

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

                              {

                                 _instance=[super allocWithZone:zone];

                                }

                         }

                     }

                    reutrn _instance;

}


下面是类方法,供其他类调用

+(id)sharedInastance

{

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

                {

                   @synchronized(self)

                     {

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

                              {

                                 _instance=[[self alloc]init];

                                }

                         }

                     }

             reutrn _instance;

}    

-(id)copyWithZone:(NSZone*)zone

{

        return _instance;

}


                               单例的简化 ———宏实现单例

一   新建单例头文件

                 singleton.h

二   在singleton.h实现.h和.m的宏定义,如下图:

注意!!!在最后一行,请勿再加“\”    !!!!!

三:如果单例在整个项目都用的上,可以把它放在.pch文件中,同时还的注意:使用宏实现单例,必须保证宏定义之前的的内容经过调试并且没有错误!!







     




 

© 著作权归作者所有

共有 人打赏支持
不孤独的美食家
粉丝 90
博文 159
码字总数 48705
作品 1
长沙
高级程序员
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho ⋅ 04/09 ⋅ 0

C#设计模式(2)——简单工厂模式

一、引言   这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工...

技术小胖子 ⋅ 2017/11/08 ⋅ 0

JavaScript设计模式之观察者模式

前言 准备研究一下MVVM的一些东西,由于MVVM运用了观察者模式的思想,因此翻开了《JavaScript设计模式与开发实践》一书,将观察者模式学习了一遍,顺便有对一些常用的设计模式进行一些了解,...

Srtian ⋅ 05/22 ⋅ 0

设计模式学习笔记之-代理模式

代理模式中,客户不会直接调用目标对象而是通过一个代码对象,客户调用代理对象代理对象去调用目标对象,起到对象与对象间的隔离作用。有时候我么不想直接访问目标对象,有时候我们不能直接访...

申文波 ⋅ 03/05 ⋅ 0

JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云 ⋅ 05/18 ⋅ 0

设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu ⋅ 2017/11/02 ⋅ 0

系统架构技能之设计模式-单件模式

一、开篇 其实我本来不是打算把系统架构中的一些设计模式单独抽出来讲解的,因为很多的好朋友也比较关注这方面的内容,所以我想通过我理解及平时项目中应用到的一 些常见的设计模式,拿出来给...

wbf961127 ⋅ 2017/11/12 ⋅ 0

Java经典设计模式-结构型模式-适配器模式(Adapter)

适配器模式 适配器模式主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的...

Idea ⋅ 01/20 ⋅ 0

设计模式.策略模式

策略模式跟抽象工厂非常相似,基本逻辑是根据需要实例化出需要用的类。不同的是策略模式需要调用者非常清晰的知道有哪些策略,各个策略的调用规则,而抽象工厂的话,需要知道有哪些类,找到调...

技术小胖子 ⋅ 2017/11/08 ⋅ 0

js策略模式《JavaScript设计模式与开发实践》阅读笔记

策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且是它们可以相互替换。 策略模式可以避免代码中的多重判断条件。 策略模式很好的体现了开放-封闭原则,将一个个算法(解决方...

RoyLuo ⋅ 05/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Thrift RPC实战(二) Thrift 网络服务模型

TServer类层次体系 TSimpleServer/TThreadPoolServer是阻塞服务模型 TNonblockingServer/THsHaServer/TThreadedSelectotServer是非阻塞服务模型(NIO) 1 TServer抽象类的定义 内部静态类Args的...

lemonLove ⋅ 16分钟前 ⋅ 0

vim命令用法

第五章 vim命令 vim和vi几乎是一样的,唯一的区别就是当编辑一个文本时,使用vi不会显示颜色,而使用vim会显示颜色。 vim有三个模式:一般模式,编辑模式,命令模式。 系统最小化安装时没有安...

弓正 ⋅ 17分钟前 ⋅ 0

MyBatis源码解读之配置

1. 目的 本文主要介绍MyBatis配置文件解析,通过源码解读mybatis-config.xml(官方默认命名)、Mapper.xml 与Java对象的映射。 2. MyBatis结构 查看大图 MyBatis结构图,原图实在太模糊了,所以...

无忌 ⋅ 21分钟前 ⋅ 0

Ignite的jdbc与网格的连接方式的查询性能对比

环境: 数据量100万 Ignite2.5 Windows10 8g jdbc方式连接 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; i......

仔仔1993 ⋅ 36分钟前 ⋅ 0

收集自网络的wordpress 分页导航的代码教程(全网最全版)

wordpress 分页导航是用来切换文章的一个功能,添加了 wordpress 分页导航后,用户即可自由到达指定的页面数浏览分类文章,而这样的一个很简单功能却有很多朋友在用插件:WP-PageNavi,插件的...

Rhymo-Wu ⋅ 51分钟前 ⋅ 0

微服务 WildFly Swarm 入门

Hello World 就像前面章节中的其他框架一样,我们希望添加一些基本的 Hello-world 功能,然后在其上逐步添加更多的功能。让我们从在我们的项目中创建一个 HolaResources 开始。您可以使用您的...

woshixin ⋅ 58分钟前 ⋅ 0

Maven的安装和Eclipse的配置

1. 下载Maven 下载地址 2. 解压压缩包,放到自己习惯的硬盘中 此处我将其放到了 D:\Tools 目录下。 3. 配置环境变量 右键此电脑 -> 属性 -> 高级系统设置 -> 环境变量。 在系统变量中新建,变...

影狼 ⋅ 今天 ⋅ 0

python pip使用国内镜像的方法

国内源 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 华中理工大学:http://......

良言 ⋅ 今天 ⋅ 0

对于url变化的spa应该如何使用微信jssdk

使用vue单页面碰上微信jssdk config验证失败的坑。第一次成功 之后切换页面全部失败,找到了解决方法,第一次验证成功后保存验证信息 切换页面时验证信息直接拿来用,加一个wx.error() 失败时...

孙冠峰 ⋅ 今天 ⋅ 0

Spring Cloud Gateway 一般集成

SCF发布,带来很多新东西,不过少了点教程,打开方式又和以前的不一样,比如这个SCG,压根就没有入门指导,所以这里写一个,以备后用。 一、集成 pom.xml <dependency> <groupI...

kut ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部