文档章节

单例模式(singleton)

木木情深
 木木情深
发布于 2014/01/05 23:17
字数 598
阅读 95
收藏 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
为什么java中用枚举实现单例模式会更好

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

zhoujy
2013/06/01
0
0
C++设计模式——一个基于C++11的万用单例模板类

单例模式概述 单例模式(Singleton),是设计模式里面最常见、最常用的设计模式,也是最简单、最容易实现的设计模式。单例模式的目的很简单,创建一个全局唯一的对象(类or变量)。 简单代码...

GodMayCry
2017/11/06
0
0
Java程序员从笨鸟到菜鸟之(三十三)大话设计模式(三)单例模式

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 单例模式属于对象创建型模式,其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点。对一些类来说...

长平狐
2012/11/12
120
0

没有更多内容

加载失败,请刷新页面

加载更多

传统IDC部署网站(三)

11. 重置密码 密钥和密码都支持远程登陆, 二选一 两个都可以登陆, 密钥相对于密码来说,相对安全一点 本地登陆无法是用密钥 修改密码 root 用户 passwd root 修改普通用户 passwd usernam...

miko0089
21分钟前
2
0
日志服务与SIEM(如Splunk)集成方案实战

背景信息 目标 本文主要介绍如何让阿里云日志服务与您的SIEM方案(如Splunk)对接, 以便确保阿里云上的所有法规、审计、与其他相关日志能够导入到您的安全运维中心(SOC)中。 名词解释 LOG(S...

阿里云官方博客
25分钟前
2
0
bash特性

1.支持别名 alias 2.命令替换 $(COMMANS) 或者 `COMMAND` 3. bash支持的引号: `` :命令替换 "":弱引用,可以实现变量替换 '':强引用,不实现变量替换 4.文件名通配 globbing:(man 7 glo...

忙碌的小蜜蜂
30分钟前
2
0
以语音评测的PC端demo代码为例,讲解口语评测如何实现

本文由云+社区发表 作者:腾讯智慧教育 概述 腾讯云智聆口语评测(英文版)(Smart Oral Evaluation-English,SOE-E)是腾讯云推出的语音评测产品,是基于英语口语类教育培训场景和腾讯云的语...

腾讯云加社区
42分钟前
1
0
浅谈SpringMVC之DispatcherServlet

Spring的MVC框架是围绕一个DispatcherServlet其实就是个Servlet(它继承自HttpServlet基类)来设计的, 它支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染、文件上传等 控制器一般...

恋码之子
45分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部