单例:整个程序只创建一次,全局共用。

  1. 单例的创建

    // SharedPerson.h 文件中
    + (instancetype)share;
    // SharedPerson.m 文件中
    static SharedPerson *_person;
    + (instancetype)allocWithZone:(struct _NSZone *)zone{
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
    _person = [super allocWithZone:zone];
    });
    return _person;
    } + (instancetype)share {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    _person = [[self alloc]init];
    });
    return _person;
    }
    - (id)copyWithZone:(NSZone *)zone {
    return _person;
    }
  2. 分析单例
    • static SharedPerson *_person : 利用static关键字来确保创建的单例对象_person只能在此类中可以访问到;将_person定义成全局变量为了确保其生命周期存在于整个程序中,期间不被销毁.
    • dispatch_once : 此函数确保_person对象在程序中只会创建一次,并且也保证了创建时的线程安全。
    • + (instancetype)share : 提供便捷的类方法来创建单例对象,强烈建议用此法创建对象。
    • + (instancetype)allocWithZone:(struct _NSZone *)zone : [SharedPerson alloc]分配对象内存时,实际会调此函数allocWithZone:(struct _NSZone *)zone,所以需要重写此方法来保证单例对象只会创建一次,而且是必须重写此方法,防止其他开发者直接用初始化方法来创建单例对象。

    • - (id)copyWithZone:(NSZone *)zone : 此函数来保证单例对象可以copy再得到一个一模一样的对象。

iOS单例详解的更多相关文章

  1. iOS开发:详解Objective-C runTime

    Objective-C总Runtime的那点事儿(一)消息机制 最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题.当然还有一些其他问题也几乎 ...

  2. 了解iOS消息推送一文就够:史上最全iOS Push技术详解

    本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...

  3. 【iOS 单例设计模式】底层解析与运用

    [iOS 单例设计模式]底层解析与运用 一.单例设计名词解释: (官方解释)单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例.(形象比喻)程序 — 公司   单例实例 - 管理 ...

  4. 转载]IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本 )

    原文地址:IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本作者:佐佐木小次郎 因为最近项目上要用有关LBS的功能.于是我便做一下预研. 一般说来LBS功能一般分为两块:一块是地理 ...

  5. iOS中-Qutarz2D详解及使用

    在iOS中Qutarz2D 详解及使用 (一)初识 介绍 Quartz 2D是二维绘图引擎. 能完成的工作有: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成 ...

  6. iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)

    前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...

  7. iOS开发——Block详解

    iOS开发--Block详解 1. Block是什么 代码块 匿名函数 闭包--能够读取其他函数内部变量的函数 函数变量 实现基于指针和函数指针 实现回调的机制 Block是一个非常有特色的语法,它可 ...

  8. iOS应用开发详解

    <iOS应用开发详解> 基本信息 作者: 郭宏志    出版社:电子工业出版社 ISBN:9787121207075 上架时间:2013-6-28 出版日期:2013 年7月 开本:16开 ...

  9. ios 单例的再次理解

    单例模式    在建模的时候,如果这个东西确实只需要一个对象,多余的对象都是无意义的,那么就考虑用单例模式.比如定位管理(CLLocationManager),硬件设备就只有一  个,弄再多的逻辑对象 ...

随机推荐

  1. 使用ActionFilterAttribute进行重定向注意事项

    1.分部视图方法不能添加该特性,会报子方法不能重定向操作的错误 2.必须用给filterContext.Result赋值的方法进行重定向,而不能用filterContext.HttpContext.R ...

  2. C++字符串格式化库:CPPFormatLibrary

    这个是很久之前写的,去年总结了一下,将其单独提取出来,作为一个开源库放到了GitHub上,然而CPPFormat之类的名字都已经被抢注了,结果只好注册了一个这么蛋疼的名字:CPPFormatLibra ...

  3. js的一些笔记

    var txt = "Hello World!";document.write("<p>字体变大: " + txt.big() + "&l ...

  4. 关于Telerik RadGridView 数据列拖动后异常的一种情况

    目的: 想实现带有复杂表头(ColumnHeader)的列的动态加载,写了一个用户控件. 问题: 动态加载成功了,显示正常,滚动条也正常,但是一旦进行列的拖动操作之后,程序就挂掉了. 解决尝试: 反复 ...

  5. Java RMI之HelloWorld篇

    Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...

  6. Holographic Remoting

    看到微软官方的 Holographic Remoting Player https://developer.microsoft.com/en-us/windows/holographic/hologr ...

  7. linux系统CentOS7

    linux系统CentOS7 到http://mirrors.sohu.com/mysql/下载想要的mysql版本 这里用到的是 mysql-5.6.33-linux-glibc2.5-x86_64 ...

  8. Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数

    特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2. $# 传递给脚本或函数的参数个数. $* 传 ...

  9. phpstorm 10注释的双斜线位置不在缩进的位置:

    22:07 2016/4/4phpstorm 10注释的双斜线位置不在缩进的位置:终于找到了(但是没有实现效果,不知道是什么原因 win10系统):File | Settings | Editor | ...

  10. 【Linux】crontab 定时任务

    7月份,公司海外运营国发生数据库联接未释放,造成连接池连接不足的情况, 当时查询并没有及时解决问题, 为了避免现场同事多次人工重启系统的,因此写了个shell脚本,通过crontab 实现系统重启,但 ...