单例模式:

为什么使用单例,单例模式的用途是什么?以下我们举一个样例来诠释一下

举个大家都熟知的样例——Windows任务管理器,如图,我们能够做一个这种尝试,在Windows的“任务栏”的右键弹出菜单上多次点击“启动任务管理器”。看是否能打开多个任务管理器窗体?通常情况下,不管我们启动任务管理多少次。Windows系统始终仅仅能弹出一个任务管理器窗体。也就是说在一个Windows系统中。任务管理器存在唯一性。为什么要这样设计呢?我们能够从下面两个方面来分析:其一,假设能弹出多个窗体,且这些窗体的内容全然一致,所有是反复对象,这势必会浪费系统资源。任务管理器须要获取系统执行时的诸多信息。这些信息的获取须要消耗一定的系统资源。包含CPU资源及内存资源等,浪费是可耻的。并且根本没有必要显示多个内容全然同样的窗体;其二,假设弹出的多个窗体内容不一致,问题就更加严重了,这意味着在某一瞬间系统资源使用情况和进程、服务等信息存在多个状态。比如任务管理器窗体A显示“CPU使用率”为10%,窗体B显示“CPU使用率”为15%,究竟哪个才是真实的呢?这纯属“调戏”用户,给用户带来误解,更不可取。由此可见,确保Windows任务管理器在系统中有且仅有一个很重要。

回到实际开发中,我们也常常遇到类似的情况,为了节约系统资源,有时须要确保系统中某个类仅仅有唯一一个实例,当这个唯一实例创建成功之后,我们无法再创建一个同类型的其它对象,全部的操作都仅仅能基于这个唯一实例。为了确保对象的唯一性,我们能够通过单例模式来实现。这就是单例模式的动机所在。

以下单例模式的几种写法:

在这里创建了一个Person类继承与NSObject

.h文件

//  Person.h

//  单例模式 Singleton

//  Copyright (c) 2014年 summer2014mht@sina.com. All rights reserved.

#import<Foundation/Foundation.h>

@interface Person :NSObject

//单例:一个类仅仅有一个实例, 在外部创建对象时,不能用alloc.(仅仅要alloc.就会在堆区开辟空间,就意味着有多个对象).

//所以我们要提供一个创建对象的方法.并且是一个+号方法

//default, standard, main, shared开头的都是单例

+ (Person *)sharedPerson;

@end

.m文件

//  Person.m

//  单例模式 Singleton

//  Copyright (c) 2014年 summer2014mht@sina.com. All rights reserved.

#import"Person.h"

@implementation Person

/*

//写法一

+ (Person *)sharedPerson

{

//声明为static ,保证该变量在程序执行期间空间都不会回收.并且保证仅仅初始化一次

//单例的空间在程序执行期间都不会回收,所以要慎重使用单例,否则会造成内存堆积

static Person *person = nil;

@synchronized(self){

if (person == nil) {

person = [[Person alloc] init];

}

}

return person;

}

*/

//写法二(推荐使用)

+ (Person *)sharedPerson

{

static Person *person = nil;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

person = [[Personalloc] init];

});

return person;

}

@end


版权声明:本文博客原创文章,博客,未经同意,不得转载。

iOS 辛格尔顿的更多相关文章

  1. iOS可视化动态绘制连通图

    上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...

  2. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  3. 【疯狂造轮子-iOS】JSON转Model系列之一

    [疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...

  4. iOS总结_UI层自我复习总结

    UI层复习笔记 在main文件中,UIApplicationMain函数一共做了三件事 根据第三个参数创建了一个应用程序对象 默认写nil,即创建的是UIApplication类型的对象,此对象看成是 ...

  5. iOS代码规范(OC和Swift)

    下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...

  6. JS调用Android、Ios原生控件

    在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...

  7. 告别被拒,如何提升iOS审核通过率(上篇)

    iOS审核一直是每款移动产品上架苹果商店时面对的一座大山,每次提审都像是一次漫长而又悲壮的旅行,经常被苹果拒之门外,无比煎熬.那么问题来了,我们有没有什么办法准确把握苹果审核准则,从而提升审核的通过率 ...

  8. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  9. Summary of Critical and Exploitable iOS Vulnerabilities in 2016

    Summary of Critical and Exploitable iOS Vulnerabilities in 2016 Author:Min (Spark) Zheng, Cererdlong ...

随机推荐

  1. Thrift搭建分布式微服务1

    Thrift搭建分布式微服务 一.Thrift是什么? 关于Thrift的基本介绍,参看张善友的文章Thrift简介. 二.为什么使用微服务? 在公司的高速发展过程中,随着业务的增长,子系统越来越多. ...

  2. Xsoup 是一款基于 Jsoup 开发的

    Xsoup 是一款基于Jsoup 开发的,使用XPath抽取Html元素的工具.它被用于作者的爬虫框架 WebMagic 中,进行XPath 解析和抽取. 此次更新主要增加了一些XPath语法的支持. ...

  3. 陈一舟《情系人人》:先搞钱,再搞人才_DoNews-IT门户-移动互联网新闻-电子商务新闻-游戏新闻-风险投资新闻-IT社交网络社区

    陈一舟<情系人人>:先搞钱,再搞人才_DoNews-IT门户-移动互联网新闻-电子商务新闻-游戏新闻-风险投资新闻-IT社交网络社区 陈一舟<情系人人>:先搞钱,再搞人才

  4. Windows下安装MySQLdb, Python操作MySQL数据库的增删改查

    这里的前提是windows上已经安装了MySQL数据库,且配置完成,能正常建表能操作. 在此基础上仅仅需安装MySQL-python-1.2.4b4.win32-py2.7.exe就ok了.仅仅有1M ...

  5. 漫谈并发编程(二):java线程的创建与基本控制

    java线程的创建 定义任务           在java中使用任务这个名词来表示一个线程控制流的代码段,用Runnable接口来标记一个任务,该接口的run方法为线程运行的代码段. public ...

  6. build setting

    A build setting is a variable that contains information about how a particular aspect of a product’s ...

  7. 通过 Jersey Http请求头,Http响应头,客户端 API 调用 REST 风格的 Web 服务

    原地址:http://blog.csdn.net/li575098618/article/details/47853263 Jersey 1.0 是一个开源的.可以用于生产环境的 JAX-RS(RES ...

  8. Knockout获取数组元素索引的2种方法,在MVC中实现

    原文:Knockout获取数组元素索引的2种方法,在MVC中实现 在遍历数组.集合的时候,通常要获取元素的索引,本篇体验使用Knockout获取索引的2种方法. 假设有这样的一个模型: namespa ...

  9. Luci - UCI (Unified Configuration Interface)

    参考: http://wiki.openwrt.org/doc/techref/uc http://luci.subsignal.org/api/luci/modules/luci.model.uci ...

  10. 文件下载-SpringMVC中測试

    直接改动文件路径就能够.其它都不须要改动,帮助类已经为大家写好,可直接使用 1.Scroller: /** * 下载文件 * @author liupeng * @param request * @p ...