单例:一个类仅仅有一个实例,在外部创建对象时,不能用alloc.(仅仅要alloc,就会在堆区开辟空间,就意味着有多个对象)所以我们要提供一个创建对象的方法:
1.加号方法

2.返回值类型为当前类

3.方法名以default ,standared,main,shared等开头 + 当前类名

以下以Person类为例

在.h文件里声明

+ (Person *)sharePerson;

在.m文件实现
第一种模式(单线程使用这样的模式)

+ (Person *)sharePerson {

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

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

static Person *person = nil;

if (!person) {

person = [[Person alloc] init];

}

return person;

}

另外一种模式(多线程使用这样的模式)

+ (Person *)sharePerson {

多线程写法

static Person *person = nil;

@synchronized(self)    {

if (person == nil) {

person = [[Person alloc] init];

}

}

return person;

}

第三种模式(单线程与多线程均可使用这样的模式)

+ (Person *)sharePerson {

static Person *person = nil;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

保证仅仅运行一次,无论是多线程,还是单线程

person = [[Person alloc] init];

});

return person;

}

转载于:https://www.cnblogs.com/claireyuancy/p/6761272.html

使用单例时的三种单例写法相关推荐

  1. vue单文件props写法_详解Vue 单文件组件的三种写法

    详解Vue 单文件组件的三种写法 JS构造选项写法 export defaul { data, methods, ...} JS class写法 @Component export default c ...

  2. haproxy中acl的与或非三种規則写法

    haproxy中acl的与或非三种規則写法 当我们在haproxy里面需要使用use_backend或http-request等语句去调用定义过的acl规则时,可以跟平时写程序一样,使用与,或,非三种 ...

  3. linq拼接where语句_C# 10. LINQ 的三种查询语句写法

    C# 10. LINQ 的三种查询语句写法 前言: LINQ(语言集成查询)是 C#编程语言中的一部分.它在.NET Framework 3.5 和 C#3.0 被引入,在 System.Linq 命 ...

  4. 【重复提交表单】表单重复提交的三种情况,解决办法

    引入 看一个重复提交表单的例子 F12可以看到,请求体中的参数在刷新页面之后仍然保留,因此每一次刷新页面,都会把现有的请求体中的表单数据提交一次到服务器,而接收的页面还是insert.jsp,于是造成 ...

  5. Spring boot Mybatis-Plus数据库单测实战(三种方式)

      单元测试长久以来是热门话题,本文不会讨论需不需要写单测,可以看看参考资料1,我个人认为写好单测应该是每个优秀开发者必备的技能,关于写单测的好处在这里我就不展开讨论了,快速进入本文着重讨论的话题,如 ...

  6. C++中函数调用时的三种参数传递方式(x,*x,x)

    先看三种方式实现函数中参数传递的实例程序 输入描述:两个待交换的整数 程序输出:交换后得按值传递两个整数 (一)按值传递:按值传递的过程为:首先计算出实参表达式的值,接着给对应的形参变量分配一个存储空 ...

  7. SQL Server 索引基础知识(10)----Join 时的三种算法简介

    我们书写查询语句的时候,Join 参数之前可以是下面三个 { LOOP | MERGE | HASH } JOIN  . 如果不使用,则系统自己分析那种方式快,使用那种方式. 这其实是SQL Serv ...

  8. vue开发入门篇(二)-axios POST提交数据的三种请求方式写法

    1.Content-Type: application/json let data = {"code":"1234","name":&quo ...

  9. iOS开发-三种倒计时的写法

    1.通过NSThread的performSelectorInBackground: 2.通过定时器,属于比较简单的写法: 3.通过GCD中的dispatch_source: 先说第一种: #impor ...

  10. c语言双链表排序交换节点_图解:单链表翻转的三种方式!

    当我们在聊到链表反转的时候,一定说的都是单链表,双链表本身就具有前驱指针 Prev 和后续指针 next,无需进行翻转. 单链表反转,反转后的效果如下: 看起来很简单,只需要将单链表所有结点的 nex ...

最新文章

  1. 完胜ReLU!斯坦福的神经网络采用这种激活函数,竟高保真还原各种图像视频
  2. 教学一体机属于计算机的什么应用,教学一体机可以投屏吗
  3. 将现有MySQL数据库改为大小写不敏感
  4. 【机器学习基础】用Python画出几种常见机器学习二分类损失函数
  5. python代码用c语言封装_使用C语言扩展Python程序的简单入门指引
  6. 企业应用人工智能面临的挑战
  7. linux中如何查看进程占用了哪些端口?
  8. POJ 3278 Catch That Cow
  9. 在线获取今天是今年的第周几
  10. 4月28日上午学习日志
  11. 【Java】0X002 Hello World
  12. 美国数据不佳美元仍跳升,只因欧元区问题更多
  13. a minimal solution(30,31,32)
  14. linux rarcrack破解rar、zip和7z压缩包简单密码的工具
  15. 查看 Chrome 下载的文件的真实下载地址
  16. 底部菜单控件BottomNavigationView的使用
  17. 2021北京家庭摇号官网信息汇总
  18. securityCRT使用小结
  19. 《山海经》第一卷(南山经)南山一经
  20. 平面设计的表现手法有哪些比较常用

热门文章

  1. MySQL源码—线程篇
  2. 设计模式学习-每日一记(16.模板方法模式)
  3. 一位清华学长的CTO成长之路 -- 不断的打破自己的边界
  4. 她不讲武德,北航博士竟然把60年来的文本分类综述都整理了!!!
  5. 【Pre-Training】超细节的 BERT/Transformer 知识点
  6. 如何优雅地(用TeX)写AI论文
  7. 每日算法系列【LeetCode 684】冗余连接
  8. transformermo
  9. LeetCode刷题——88. 合并两个有序数组
  10. 选书不迷茫,国内原创佳作推荐,附赠神级优惠码༼⍤༽