文档章节

单例模式(singleton)

木木情深
 木木情深
发布于 2014/01/05 23:17
字数 598
阅读 90
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

[MicroPython]STM32F407开发板驱动OLED液晶屏

1.实验目的 1.学习在PC机系统中扩展简单I/O 接口的方法。 2.进一步学习编制数据输出程序的设计方法。 3.学习 F407 Micropython开发板控制OLED显示字符。 2.所需元器件 F407 Micropython开发板...

bodasisiter
29分钟前
0
0
php require和include 相对路径一个有趣的坑

以前总是被教育,不要使用相对路径,这样性能比较差,但是相对路径的问题不仅仅是性能哦,看下面这里例子 这是项目结构 .├── main.php├── t│ ├── t1.php│ └── t2.php└─...

anoty
29分钟前
15
0
x64技术之SSDT_Hook

测试环境: 虚拟机: Windows 7 64bit 过PG工具 驱动加载工具 PCHunter64 系统自带的计算器和任务管理器等 实现思路: 实际思路与win32的思路一样.都是替换SSDT表里边的函数地址.不过微软被搞怕...

simpower
31分钟前
0
0
TreeMap源码分析,看了都说好

一、简介 TreeMap最早出现在JDK 1.2中,是 Java 集合框架中比较重要一个的实现。TreeMap 底层基于红黑树实现,可保证在log(n)时间复杂度内完成 containsKey、get、put 和 remove 操作,效率很...

Java小铺
41分钟前
0
0
协变、逆变

概念 假设 A、B表示类型 ≤ 表示继承关系 f<⋅>表示类型转换 若A ≤ B,则 A是B的子类,B是A的超类 协变、逆变 什么是型变?型变(type variance)允许对类型进行子类型转换。 为了下面讲解先...

obaniu
47分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部