用GCD写Objective-c的单例模式和C#有比较大的区别

声明h文件

#import <Foundation/Foundation.h>

@interface me : NSObject<NSObject>
@property (nonatomic) NSInteger age;
+(instancetype)makeme;
@end

instancetype和id的区别

instancetype返回的是该实例类型,而id返回的是未知类型

①instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象,便于编写调试

②instancetype只能作为返回值,不能像id那样作为参数

具体原理是利用dispatch_once 来创建一个单实例,因为该函数在程序生命周期内只运行一次

void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);

第一个参数是检查后面第二个参数所代表的代码块是否被调用的谓词,第二个参数是在整个应用程序中只会被调用一次的代码块。

不过众多的dispath_once版本中我认为这个下面这个还不错

#import "me.h"
static me *myself;
@implementation me
+(id)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onetaken;
dispatch_once(&onetaken,^{
myself=[super allocWithZone:zone];
});
return myself;
}
+(instancetype)makeme{
static dispatch_once_t onetaken;
dispatch_once(&onetaken, ^{
myself=[[self alloc]init];
});
return myself;
}
-(id)copy{
return myself;
}

这里我们需要弄清楚allocWithZone方法。oc对象的初始化是alloc和init配合。alloc划分内存,init为实例配置参数变量,如对比下面代码,我删除了allocWithZone方法

#import "me.h"
static me *myself;
@implementation me
+(instancetype)makeme{
static dispatch_once_t onetaken;
dispatch_once(&onetaken, ^{
myself=[[self alloc]init];
});
return myself;
}

下面的例子是如果你如果用了

me *myself=[[me alloc]init];
me *myself1=[me makeme];

你会发现你获得了一个新的实例,。。。myself和myself1是不同的,这货不是单实例。。。当然因为我们用的alloc+init方法已经绕过了dispath_once的方法,单实例也就失效了

这意味着我们需要从实例初始化的地方开始

查看allocWithZone方法的介绍是

使用alloc方法初始化一个类的实例的时候,默认是调用了 allocWithZone 的方法。于是我们可以把这个也堵上就即使用户使用alloc +init 也不会产生新的实例。

Objective-c 单例模式的更多相关文章

  1. Automake

    Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...

  2. 从Objective-C到Swift 单例模式

    在Objective-C中经常会用到单例模式.最常见的就是: [UIApplication sharedApplication].delegate 这里的sharedApplication就是一个返回 ...

  3. Design Patterns Simplified - Part 2 (Singleton)【设计模式简述--第二部分(单例模式)】

    原文链接: http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part-2-singleton/ De ...

  4. iOS开发核心语言Objective C —— 全部知识点总结

    本分享是面向有意向从事iOS开发的伙伴及苹果产品的发烧友,亦或是已经从事了iOS的开发人员,想进一步提升者.假设您对iOS开发有极高的兴趣,能够与我一起探讨iOS开发.一起学习,共同进步.假设您是零基 ...

  5. Objective-C在ARC下结合GCD的单例模式和宏模版

    单例模式在iOS开发过程中经常用到,苹果提供过objective c单例的比较官方的写法: static MyGizmoClass *sharedGizmoManager = nil; + (MyGi ...

  6. C++实现线程安全的单例模式

    在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...

  7. 23种设计模式--单例模式-Singleton

    一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...

  8. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

  9. java设计模式之--单例模式

    前言:最近看完<java多线程编程核心技术>一书后,对第六章的单例模式和多线程这章颇有兴趣,我知道我看完书还是记不住多少的,写篇博客记录自己所学的只是还是很有必要的,学习贵在坚持. 单例模 ...

  10. 设计模式C#合集--单例模式

    单例模式 代码: 第一种: private static Singleton singleton = null; private Singleton() { } public static Singl ...

随机推荐

  1. 【 D3.js 入门系列 --- 5 】 怎样加入坐标轴

    本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处.谢谢.      第3节中做了一个图标.但没有为它加入一个对应的坐标轴. ...

  2. eclipse spring xml 无提示解决

    增加自动提示的步骤: 1.window->preference.->xml-xml catalog 2.选中 user specified entried 3.选则Add..按钮 URI: ...

  3. Html Table用JS导出excel格式问题 导出EXCEL后单元格里的000412341234会变成412341234 7-14 会变成 2018-7-14(7月14) 自定义格式 web利用table表格生成excel格式问题 js导出excel增加表头、mso-number-format定义数据格式 数字输出格式转换 mso-number-format:"\@"

    Html Table用JS导出excel格式问题 我在网上找的JS把HTML Tabel导出成EXCEL.但是如果Table里的数字内容为0开的的导成Excel后会自动删除0,我想以text的格式写入 ...

  4. RabbitMQ实战:理解消息通信

    RabbitMQ是一个开源的消息代理和队列服务器,可以通过基本协议在完全不同的应用之间共享数据,可以将作业排队以便让分布式服务进行处理. 本篇介绍下消息通信,首先介绍基础概念,将这些概念映射到AMQP ...

  5. Python - pandas 数据分析

    pandas: powerful Python data analysis toolkit 官方文档: http://pandas.pydata.org/pandas-docs/stable/ 1. ...

  6. Repository、IUnitOfWork 和 IDbContext

    1)领域层不应该直接依赖于仓储实现:如果领域层依赖于仓储实现,一是技术绑定太紧密,二是仓储要对领域对象作操作,会造成循环依赖. 2)将接口定义在领域层,减少技术架构依赖,应用层或领域层要使用某个仓储实 ...

  7. Linux LVM逻辑卷配置过程详解(创建、扩展、缩减、删除、卸载、快照创建)(未完)

    转:http://blog.csdn.net/xuanfeng407/article/details/51465472

  8. Vivado 与 Modelsim 联合仿真

    1 编译库 用命令行 用vivado工具 vivado 有很多 IP核的接口 已经与 ISE的核 不太一样了,比如fir ,接口就是这样的: fir_lp fir_lp_ip(    .aclk  ( ...

  9. NGINX扩展

    https://github.com/cuber/ngx_http_google_filter_module

  10. ccentos 7下安装php5.6并使用nginx + php-fpm部署多个不同端口网站

    作为一个的勤杂工,近期因公司内部信息化的需求,给新进员工提供基础的知识培训和介绍,也为了给公司内部建立一个沟通交流的平台,百度找了开源的百科系统HDwiki和开源的问答系统Tipask问答系统,蛋痛的 ...