文档章节

单例模式(singleton)

木木情深
 木木情深
发布于 2014/01/05 23:17
字数 598
阅读 92
收藏 4

1. 主要作用:多个对象之间共享数据。(貌似和浅拷贝有点像,呵呵。。。。。

2. 主要特点:

    1).单例就是C中的全局变量

    2).在整个程序生命周期内,该对象只有一份存在内存中。

    3).单例对象在创建时,不要使用alloc 来创建。

    4).可以在多个对象之间共享数据。

3. 示例:皮肤主题的更换(确定的主题这一对象是唯一的,只是内容在变);UIDevice对象(可取得手机的序列号,版本等等);

主题共享代码实现:

ThemeManage.m文件:

static id sharedMyManager;

+(id)sharedThemeManage

{

    if(sharedMyManager == nil)

    {

        //第一次调用sharedMyManager 把存入全局变量中

        sharedMyManager = [[[self class] alloc]init];      

    }

    return sharedMyManager;

}

调用方法:

//创建单例对象

ThemeManage *theme = [ThemeManage sharedThemeMyManager];

//修改单例对象属性

theme.name = @"how are you";

NSLog(@"theme.name = %@",theme.name);

ThemeManage *theme1 = [ThemeManage sharedThemeMyManager];

NSLog(@"theme is %p,theme1 is %p",theme,theme1);


theme1.name = @"Nice to meet you";

NSLog(@"theme.name = %@,theme1.name = %@",theme.name,theme1.name);

输出结果:  theme.name = how are you

            theme is 0x1001004f0,theme1 is 0x1001004f0

            theme.name = Nice to meet you,theme1.name = Nice to meet you

1) 说明:1.单例对象不管建立多少次,内存地址都是唯一的

      2.正因为1的结论,我们同过单例才可以共享数据,修改 theme1的变量属性时,theme 的变量属性页跟着一起被改变

2) 缺点:两个线程同时调用时,会同时进入,导致内存泄露,优化方案:

    方案一:Lock free (免锁)

            +(voidq)initialize

            {

                static BOOL initialized = NO;

                if(initialized == NO)

                {

                    initialized = YES;

                    sharedMyManager = [[self alloc]init];

                }

            }

    方案二:GCD ( center dispath)dispatch_once保证block 只能执行一次

         +(id)sharedManager

        {

            static dispatch_once_t once;

            dispatch_once(&once,^{

                sharedMyManager = [[self alloc]init];

            });

            return sharedMyManager;

        }

    方案三:@synchronized(self) 保证这段代码处于atomic状态,即多个线程进入这段代码时,这段代码只能被一个线程执行

        +(id)sharedThemeManager

        {

            @synchronized(self)

            {

                if(sharedMyManager == nil)

                {

                    sharedMyManager = [[[self class] alloc]init];      

                }

                return sharedMyManager;

            }

        }

    方案四:完全的单例,需要重写以下方法

        //alloc 时需要调用

        +(id)allocWithZone:(NSZone *)zone

        {

             return [[self sharedThemeManager] retain];  

         }

        //copy 时需要调用

        +(id)copyWithZone:(NSZone *)zone

        {

            return self;

        }

        -(id)retain

        {

            return self;

        }

        -(oneway void)release

        {

            

        }

        -(MSUInteger)retainCount

        {

            return UINT_MAX;

        }

        -(id)autorelease

        {

            return self;

        }

说明:完全写法可以保证以下的创建单例对象写法,也可以成功的创建全局唯一的一个变量

        ThemeManage *theme2 = [[ThemeManage alloc]init];

        ThemeManage *theme3 = [theme2 copy];

4)


© 著作权归作者所有

共有 人打赏支持
木木情深
粉丝 37
博文 189
码字总数 26451
作品 0
广州
程序员
设计模式1——Singleton设计模式

Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序运行生命周期中,使用了单例模式的类只能有一个实例对象存在。单例模式实现了类似C语言中全局变量的功能,单例模式常用于注册...

小米米儿小
2013/12/05
0
0
23种设计模式(1):单例模式

定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 类型:创建类模式 类图: 类图知识点: 1.类图分为三部分,依次是类名、属性、方法 2.以<<开头和以>>结尾的为注释...

LCZ777
2014/07/05
0
0
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
0
0
炒冷饭系列:设计模式 单例模式

炒冷饭系列:设计模式 单例模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 亲爱我,孝何难;亲恶我,孝方贤。 一、什么是单例模式 单例模...

泥沙砖瓦浆木匠
2014/07/28
0
0
为什么java中用枚举实现单例模式会更好

枚举单例是java中使用枚举提供一个实例对象来实现单例模式的一种新方法,虽然单例模式在java中早已存在,但枚举单例实际上从java5引入枚举作为它的关键特性之后相对来说还是一个新的概念,这...

zhoujy
2013/06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

oracle 安装 PL/SQL Developer连接64位Oracle免安装配置

PL/SQL Developer连接64位Oracle 在64位系统上安装64位的Oracle数据库,但是没有对应的64位PL/SQL Developer,此时就不能使用PL/SQL Developer来进行直接连接的,所以要想实现连接还得需要其...

PeakFang-BOK
13分钟前
2
0
裁员寒冬袭来,30岁还在CRUD的Java程序员,拿什么安身立命?

就在近日,智联招聘公布的数据更是侧面印证了很多公司“瘦身”的事实:“2018年第二季度,小微企业用人需求较第一季度平均下降26.6%”。 裁员大潮正滚滚向前,席卷各行各业! 你做好失业的准...

Java填坑之路
15分钟前
3
0
第一章:什么是SpringCloud

第一章:什么是SpringCloud 何为微服务 在了解 SpringCloud之前,我们先来大致了解下 微服务这个概念吧。 传统单体架构 单体架构在小微企业比较常见,典型代表就是一个应用、一个数据库、一个...

DemonsI
20分钟前
5
0
环境搭建之八-- node.js

1.node.js官网下载64位二进制压缩包 node-v8.12.0-linux-x64.tar.xz 2.解压文件 2.1 xz格式文件为 tar格式 xz -d node-v8.12.0-linux-x64.tar.xz 此时文件已经转变为 node-v8.12.0-linux-x64...

imbiao
24分钟前
1
0
JVM调优浅谈

1.数据类型 java虚拟机中,数据类型可以分为两类:基本类型和引用类型。 基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值。 “引用值”代表了某个对象的...

xtof
28分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部