用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. 【Java】Java_04 HelloWorld提升

    HelloWorld的总结与提升 1.Java对大小写敏感,如果出现了大小写拼写错误,程序无法运行 2.关键字public被称作访问修饰符(access modifier),用于控制程序的其它部分对这 ...

  2. Android学习笔记(一)——Activity简介 和 View

    源文链接:http://www.cnblogs.com/shyang--TechBlogs/archive/2011/03/14/1984195.html Android SDK ( Software ...

  3. 字符串算法之 AC自己主动机

    近期一直在学习字符串之类的算法,感觉BF算法,尽管非常easy理解,可是easy超时,全部就想学习其它的一些字符串算法来提高一下,近期学习了一下AC自己主动机.尽管感觉有所收获,可是还是有些朦胧的感觉 ...

  4. Enum,int,string类型互转

    举例:enum Colors { Red, Green, Blue, Yellow }; Enum-->String (1)利用Object.ToString()方法:如Colors.Green ...

  5. protobuf 在win10系统如何编译jar包

    最近在搞java服务器项目,前段要求用protobuf进行数据传输,以前没搞过,查了很多资料,走了一些弯路! 先把一些需要下载的链接放上来: protobuf下载地址:https://github.c ...

  6. java包命名规则

    package indi/onem.发起者名.项目名.模块名... package pers.个人名.项目名.模块名... package priv.个人名.项目名.模块名... package te ...

  7. mysql workbench 导出表结构

    Server->Data Export 选择数据库(我的是 lhc库) -> 选择对应表(我的是  device表), Dump Structre and Data 导出表数据和表结构 D ...

  8. shiro配置数据库连接池总结

    在项目中要使用shiro做权限认证和登录许可等,现在总结一份,以备以后使用 ms sql版本 [main]ds=com.mchange.v2.c3p0.ComboPooledDataSourceds. ...

  9. JNDI提供了一种统一的方式,可以用在网络上查找和访问服务

    JNDI提供了一种统一的方式,可以用在网络上查找和访问服务.通过指定一个资源名称,该名称对应于数据库或命名服务中的一个记录,同时返回数据库连接建立所必须的信息. JNDI主要有两部分组成:应用程序编程 ...

  10. Hibernate每个层次类一张表(使用注释)

    在上一文章中,我们使用xml文件将继承层次映射到一个表. 在这里,我们将使用注释来执行同样的任务.需要使用@Inheritance(strategy = InheritanceType.SINGLE_ ...