文档章节

单例模式的笔记

不孤独的美食家
 不孤独的美食家
发布于 2015/06/09 13:47
字数 750
阅读 58
收藏 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文件中,同时还的注意:使用宏实现单例,必须保证宏定义之前的的内容经过调试并且没有错误!!







     




 

© 著作权归作者所有

共有 人打赏支持
不孤独的美食家
粉丝 88
博文 159
码字总数 48705
作品 1
长沙
高级程序员
私信 提问
Head First Design Pattern 读书笔记(1) 策略模式

Head First Design Pattern 读书笔记(1) Strategy Pattern 策略模式 这几天为了锻炼看英语文档的能力,开着有道硬着头皮看 《Head First Desgin Pattern》的原版书,顺便做下笔记,把里面提...

Tek_Eternal
2015/01/02
0
0
设计模式学习笔记之-代理模式

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

申文波
03/05
0
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
设计模式学习笔记十四:适配器模式、桥接模式与外观模式

1.适配器模式与桥接模式的区别和联系 适配器模式和桥接模式都是间接引用对象,因此可以使系统更灵活,在实现上都涉及从自身以外的一个接口向被引用的对象发出请求。 两种模式的区别在于使用场...

长平狐
2013/06/17
89
0

没有更多内容

加载失败,请刷新页面

加载更多

详解css BEM书写规范

BEM是基于组件的web开发方法。其思想是将用户界面分隔为独立的块,从而使开发复杂的UI界面变得更简单和快,且不需要粘贴复制便可复用现有代码。BEM由Block、Element、Modifier组成。选择器里...

前端小攻略
6分钟前
0
0
一个centos初始化脚本

概述 就是自己无聊写的一个脚本,欢迎使用,star,fork顺便关注我一波 https://github.com/bboysoulcn/centos 使用方法 这个是给最小化安装的centos使用的,在centos 7.5上测试过,当然其他的...

bboysoulcn
10分钟前
0
0
mybatis 自动维护 createdAt, updatedAt

SpringBoot Mybatis Plus公共字段自动填充功能

youngjdong
13分钟前
0
0
Docker之nginx容器中部署静态文件

注: Docker版本如下: Client: Version:17.12.0-ce API version:1.35 Go version:go1.9.2 Git commit:c97c6d6 Built:Wed Dec 27 20:11:19 2017 OS/Arch:linux/amd64Ser......

克虏伯
14分钟前
0
0
搭建git服务器————gitlab

github毕竟是公开的,而私有仓库又得花钱买。所以我们可以想办法搭建一个私有的,只自己公司使用的。Gitlab是个不错的选择。在介绍它之前,先讲述一下命令行的git服务器 找一台服务器,首先要...

chencheng-linux
21分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部