单例模式只能修改无法释放,直到程序结束。

我们下面一步一步来做一个单例模式程序

(1)单例一旦创建,是永远存在于内存中的,所以需要创建一个全局量

static MySingletonClass *sharedSingleTonObj=nil;

(2)既然是单例,一定有一个构造方法直接忽略跳过实例对象的生成过程。据此看来“类方法”最合适不过了

+(MySingletonClass *)sharedSingleton
{
//多线程安全的关键字,相关概念可以参考多线程编程章节
@synchronized(self)
{
//创建
if(sharedSingletonObj==nil)
{
sharedSingletonObj= [[super allocWithZone:NULL] init];
}
//发出必要警告
else
{
NSLog(@"单例对象已经存在!");
}
}
return sharedSingletonObj;
}

(3)如果对sharedSingletonObj执行了copy呢?我们需要重新写copy方法

-(id)copyWithZone:(NSZone *)zone
{
return self;
}

(4)如果对sharedSingletonObj执行了retain呢?我们同样需要重写retain方法。

-(id)retain
{
return self;
}

(5)继续对release和autorelease的方法重写

-(void)release
{
} -(id)autorelease
{
return self;
}

(6)重要的一点!我们需要实现NSObjec里面,关于引用计数API的重写以避免因为引用计数为0导致dealloc的触发

-(NSUInteger)retainCount
{
//是一个无限大的int数,避免额系统自动触发单例dealloc方法
//也可以明确告知调用者,这是一个单例模式
return NSUIntegerMax;
}

(7)最后,你会发现就这样让人使用的话,如果不通过类方法创建对象转而调用alloc创建,则每次会分配新内存引用计数+1,显然alloc方法势必也不要重写

+(id)allocWithZone:(NSZone *)zone
{
//直接套用sharedSingleton,retain 符合alloc惯例
//使类方法返回的对象的引用计数+1,此处retain根据上面的重写内容,不做任何事情
return [[MySingletonClass sharedSingleton] retain];
}

我们需要注意的时:往往只需要一个单例对象而已,但是如果仍相用alloc和init创建这个类的其他对象,那上述写法中,我们不需要重写2,3,4,5,6的代码

注:如果用gcd的话 ,只要在.m文件中实现这就可以 .h文件中声明一下这个 + (XEMessageData*) sharedInstance;

+ (XEMessageData*) sharedInstance
{
static XEMessageData* sharedInstance;
static dispatch_once_t predicate;
dispatch_once(&predicate,^{
sharedInstance = [[self alloc] init];
sharedInstance.tempConversationMessageID2ConversationID = [[NSMutableDictionary alloc] init];
}); return sharedInstance;
}

IOS 单例模式的学习的更多相关文章

  1. iOS单例模式(Singleton)写法简析

    单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例: ...

  2. IOS单例模式(Singleton)

    IOS单例模式(Singleton)   单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模 ...

  3. iOS开发如何学习前端(2)

    iOS开发如何学习前端(2) 上一篇成果如下. 实现的效果如下. 实现了一个横放的<ul>,也既iOS中的UITableView. 实现了当鼠标移动到列表中的某一个<li>,也 ...

  4. iOS开发如何学习前端(1)

    iOS开发如何学习前端(1) 我为何学前端?因为无聊. 概念 前端大概三大块. HTML CSS JavaScript 基本上每个概念在iOS中都有对应的.HTML请想象成只能拉Autolayout或 ...

  5. 移动开发iOS&Android对比学习--异步处理

    在移动开发里很多时候需要用到异步处理.Android的主线程如果等待超过一定时间的时候直接出现ANR(对不熟悉Android的朋友这里需要解释一下什么叫ANR.ANR就是Application Not ...

  6. 关于iOS开发的学习

    关于iOS开发的学习,打个比方就像把汽车分解:    最底层的原料有塑料,钢铁    再用这些底层的东西造出来发动机,座椅    最后再加上写螺丝,胶水等,把汽车就拼起来了 iOS基本都是英文的资料, ...

  7. IOS之Objective-C学习 ARC下的单例模式

    单例模式是我常用的一种设计模式,最常见的用途就是用来保存数据并且传递数据.这都归功于单例模式的特性,首先就让我为大家简单介绍一下单例模式的特性. 单例模式的三大特性: 1.某个类只能有一个实例: 2. ...

  8. iOS 单例模式 学习 "52个方法 第6章 45条 使用 dispath_once 来执行只需运行一次的线程安全代码"

    百度定义:单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例. 维基百科:在软件工程中,单例是一种用于实现单例的数学概念,即将 ...

  9. IOS 单例模式的写法

    iOS的单例模式有两种官方写法,如下: 1)不使用GCD的方式 #import "Manager.h" static Manager *manager; @implementati ...

随机推荐

  1. SDOTOJ2088 refresh的停车场(栈和队列)

     refresh的停车场 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit S ...

  2. 菜鸟运维笔记:安装MySQL,PHP及phpMyAdmin

    转载请注明出处:http://blog.csdn.net/guodongxiaren/article/details/40684799 阿里云提示我备案,挺烦人的.前天通过github的学生开发包. ...

  3. javascript中数据类型转换

    转换为数字: parseInt():转换为整数型数值:从下标0开始判断,若为数值型则继续直到遇到非数值,返回前面的整数值: 小数点无效,若0开始为非数值则返回NaN: 转换空字符串会返回NaN: 能转 ...

  4. 网页平面设计 CSS

    1.在html中引入css的方法 1.行内式 行内式即在标记的style属性中设定CSS样式,这种方式本质上没有体现出CSS的优势,因此不推荐使用. 例如:<h1 style="属性名 ...

  5. MarkDown使用 (一)

    MarkDown的数学公式输入 MarkDown的数学公式输入 1.如何插入公式 LaTeX的数学公式有两种:行中公式和独立公式.行中公式放在文中与其它文字混编,独立公式单独成行. 行中公式可以用如下 ...

  6. 星际地图制作中OB无建筑 退出问题

    星际地图制作中OB玩家没有建筑强制退出问题,目前 用下面的方法解决 ob玩家分到一个组,触发里面 延时几秒 我设置的2秒 KILL掉这个组的建筑就行~

  7. android双击返回键退出程序

    今天给大家简单说一下,android双击返回键退出程序. @Override public boolean onKeyDown(int keyCode, KeyEvent event) {      ...

  8. SMT贴片红胶基本知识

    SMT贴片红胶是一种聚稀化合物,与锡膏不同的是其受热后便固化,其凝固点温度为150℃,这时,红胶开始由膏状体直接变成固体. SMT贴片机装贴贴片具有粘度流动性,温度特性,润湿特性等.根据红胶的这个特性 ...

  9. iOS中菊花。。。

    其实系统的菊花除了功能有点单一,不具有刷新页面的功能以外,其他都还好吧,满足你一些正常的提示功能还是绰绰有余的:直接把项目里面的代码粘出来吧,其实也没有什么特别要注意的地方,一些设置属性也算留个备份 ...

  10. hibernate-search-5.1.1简易使用

    系统要求java7和hibernate-core-4.3.8,此外还依赖如下jar包 使用demo如下: package com.ciaos.controller; import java.io.IO ...