文档章节

iOS: The Two Ways of Singleton Pattern

BluesChow
 BluesChow
发布于 2015/02/28 15:02
字数 236
阅读 17
收藏 0

iOS开发中,单例模式用的很多,什么是单例,简单来讲“单例是一个类,这个类只有一个实例被实例化。”通常我们会有2种方式使用单例:

1.同步锁的方式

+ (MyClass *)shareInstance {
    static MyClass *obj = nil;
    @synchronized(self) { // **** 或者@synchronized([MyClass class])
        if (nil == obj) {
            obj = [[MyClass alloc] init];
        }
    }
    return obj;
}
2.GCD的dispatch_once方式
+ (MyClass *)shareInstance {
    static dispatch_once_t pred;
    static MyClass *obj = nil;
    dispatch_once_t(&pred, ^{
        obj = [[MyClass alloc] init];
    });
    return obj;
}

dispatch_once的方式同样可以完成和synchronized关键字一样的内容,但是dispatch_once的方式不需要付出锁的资源消耗,也不会带来额外的函数调用的消耗,因为dispatch_once本质上是一个宏。

如果是非ARC的话,就需要额外的实现几个方法,类似copyWithZone:等,具体可以参见:

http://blog.sina.com.cn/s/blog_7c452219010148jo.html

http://blog.csdn.net/ouyangtianhan/article/details/17709827

Reference:

http://blog.csdn.net/swj6125/article/details/9791183

http://www.ianisme.com/ios/1648.html

http://blog.csdn.net/sanpintian/article/details/8139635

© 著作权归作者所有

共有 人打赏支持
BluesChow
粉丝 5
博文 163
码字总数 29622
作品 0
深圳
程序员
私信 提问
八个移动产品设计必备网站

移动产品设计人员一定需要大量的使用其他各类应用,并且需要在产品设计时大量参考其他的移动应用的产品设计,这时如果有一些网站可以将很多优秀应用的不同流程分类展示,那一定是移动产品设计...

MrMign
2012/06/20
2.2K
7
Knowledge-Reserve

Knowledge-Reserve ComputerOperatingSystem 编译 静态库&动态库(Linux) 静态链接&动态链接 内存 内联函数&宏 Static&Const 死锁 线程安全 线程同步 锁 DataStructure Programme 集约型&离散...

旭宝爱吃鱼
08/16
0
0
iOS Design Patterns Excerpt

How MVC works MVC is a design pattern that enforces the separation between the input, processing, and output of an application. To this end, an application is divided into three......

Herbert77
2015/09/02
0
0
Mozilla证实:火狐不会有iOS版本

“Mozilla的产品副总裁Jay Sullivan已经表明,只要苹果不改掉它对第三方浏览器的不友好态度,Mozilla这个非营利性的组织是不会开发火狐浏览器的iOS版本的。”所以,这看起来像永远不会发生的...

xyxzfj
2013/03/11
9
0
面试官自述:面向高级开发人员的iOS面试问题

当您准备进行技术性iOS面试时,了解您可能会询问哪些主题以及经验丰富的iOS开发人员期望什么是非常重要的。 这是许多硅谷公司用来衡量iOS候选人资历水平的一系列问题。 这些问题涉及iOS开发的...

菇哒微课
04/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

基于 Docker 快速部署多需求 Spark 自动化测试环境

引言 在进行数据分析时,Spark 越来越广泛的被使用。在测试需求越来越多、测试用例数量越来越大的情况下,能够根据需求快速自动化部署 Spark 环境、快速完成所有测试越来越重要。 本文基于 ...

呐呐丶嘿
11分钟前
0
0
支付宝APP支付之查看支付宝商户ID

1、登录支付宝蚂蚁金服开放平台 2、查看账号详情,选择合作伙伴管理,账户管理,查看角色身份,此处的PID就是商户ID 3、点击秘钥管理,可查看绑定的相关应用及其APPID等信息

Code辉
14分钟前
0
0
崛起于Springboot2.X之通讯WebSocket(40)

技术简介:Springboot2.0.3+freemaker+websocket 1、添加pom依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo......

木九天
23分钟前
1
0
Java常用四大线程池用法以及ThreadPoolExecutor详解

为什么用线程池? 1.创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处-理效率 2.线程并发数量过多,抢占系统资源从而导致阻塞 3.对线程进行一些简单的管理 在Java中...

孟飞阳
24分钟前
1
0
Netty+Websocket 实现一个简易聊天室

后台代码 /** * 服务端 */public class ChatServer {public static void main(String[] args) throws Exception {int port=8080; //服务端默认端口new ChatServer().bind...

这很耳东先生
26分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部