文档章节

单例模式的笔记

不孤独的美食家
 不孤独的美食家
发布于 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
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

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

Carson_Ho
04/09
0
0
Happy 设计模式之工厂模式(Java)

闲暇之余学习设计模式。只是把我理解的整理成笔记,如果有不对的地方,请各位大牛指出。 工厂模式 1、简单工厂模式、 2、工厂方法模式、 3、抽象工厂模式、 下面首先介绍简单工厂模式: 先看...

豆芽菜橙
07/03
0
0
编程中的那些套路——关于策略模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天讲讲策略模式,策略模式 和工厂模式十分相像(或者说在代码逻辑层面,他们是一样的)。 但策略模式与...

gzchen
08/27
0
0
设计模式之观察者模式(行为型)

模式定义 观察者模式(Observer Pattern):观察者模式定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖的对象皆得到通知并且被自动更新。不过观察者只能知道目标...

Javahih
07/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

storm drpc实例

序 本文主要演示一下storm drpc实例 配置 version: '2'services: supervisor: image: storm container_name: supervisor command: storm supervisor -c storm.......

go4it
14分钟前
0
0
官宣 | Chrome 70正式向所有HTTP网站发出红色“不安全”警告!

10月17日,坐拥10亿用户的Chrome浏览器正式上线70版本。作为第一个采用TLS1.3正式版的Chrome版本,在安全新功能方面,Chrome 70进一步升级了HTTP页面“不安全”显示标识,即当用户输入数据时...

亚洲诚信
15分钟前
1
0
mysql 数据类型及占用字节数

数字类型 TINYINT                           1 字节 SMALLINT                          2 个字节 MEDIUMINT                         3 个字节...

会游泳的鱼_
今天
6
0
高性能mysql:创建高性能的索引

性能优化简介 MySQL性能定义为完成某件任务所需要的时间量度,换句话说,性能即响应时间,这是一个非常重要的原则。我们通过任务和时间而不是资源来测量性能。数据库服务器的目的是执行SQL语...

背后的辛酸
今天
8
0
HTTP get、post 中请求json与map传参格式

import java.io.IOException;import java.net.URI;import java.net.URISyntaxException;import java.nio.charset.Charset;import java.util.ArrayList;import java.util.List;im......

寒风中的独狼
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部