在iOS开发中经常会用到单例,比如每个iOS程序本身就是一个单例,在比如进行个人偏好设置存储的时候用的也是一个单例。那我们如何自己来写一个单例类呢,用自己的单例对象呢?下面是我写的一个单例的头文件里的代码,这个文件主要是一些宏。使用步骤写的都很详细,ARC或MRC都可以使用。有了这个头文件,只要在使用的时候包含这个文件,基本上就OK了。具体怎么使用,下面有详细说明。

//  Singleton.h

//  单例的宏

/*

使用方法

1:包含这个头文件

2:在.h文件总包含 singleton_h(name) 里面的name是你想要生成单例对象时的名字

3:在.m文件中包含 singleton_m(name) 里面的name是你想要生成单例对象时的名字

注意2、3步中的name要一致

4:写init初始化方法,因为每个单例类初始化的内容不一样,所以没有写到宏里面,在创建单例类时记得写init方法

5: 创建单例对象 [ 类名 share+(name)]

例如我们创建一个Person类的单例: 1 在Person的.h 文件中 singleton_h(Person)

2 在Person的.m 文件中 singleton_m(Person)

3 在Person的.m文件中写初始化方法

-(instancetype)init{

static id obj;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

if ((obj = [super init])) {

//这里进行本类的初始化

}

});

self = obj;

return self;

}

}

4 在使用的地方包含Person这个类的头文件 [ Person sharePerson ];

// ## :连接字符串和参数

// \ :表示下一行也是当前行的内容

*/

#ifndef Singleton_h

#define Singleton_h

#define singleton_h(name) +(instancetype)share##name;

#if __has_feature(objc_arc) // ARC

#define singleton_m(name) \

static id instance;\

+(instancetype)allocWithZone:(struct _NSZone *)zone{\

\

static dispatch_once_t onceToken;\

dispatch_once(&onceToken, ^{\

instance = [super allocWithZone:zone];\

});\

\

return instance;\

}\

\

+(instancetype)share##name{\

return [[self alloc]init];\

}\

+(id)copyWithZone:(struct _NSZone *)zone{\

return instance;\

}

#else //非ARC

#define singleton_m(name) \

static id instance;\

+(instancetype)allocWithZone:(struct _NSZone *)zone{\

\

static dispatch_once_t onceToken;\

dispatch_once(&onceToken, ^{\

instance = [super allocWithZone:zone];\

});\

\

return instance;\

}\

\

+(instancetype)share##name{\

return [[self alloc]init];\

}\

\

-(oneway void)release{\

\

\

}\

-(instancetype)autorelease{\

return instance;\

}\

\

-(instancetype)retain{\

return instance;\

}\

\

+(id)copyWithZone:(struct _NSZone *)zone{\

return instance;\

}\

\

-(NSUInteger)retainCount{\

return 1;\

}

#endif

#endif

iOS 开发中的单例的更多相关文章

  1. iOS——Swift开发中的单例设计模式(摘译,非原创)

    最近在开发一个小的应用,遇到了一些Objective-c上面常用的单例模式,但是swift上面还是有一定区别的,反复倒来倒去发现不能按常理(正常的oc to swift的方式)出牌,因此搜索了一些帖子 ...

  2. iOS--Swift开发中的单例设计模式

    最近在开发一个小的应用,遇到了一些Objective-c上面常用的单例模式,但是swift上面还是有一定区别的,反复倒来倒去发现不能按常理(正常的oc to swift的方式)出牌,因此搜索了一些帖子 ...

  3. 【iOS开发】创建单例的两种方法

    创建一个单例很多办法.我先列举一个苹果官方文档中的写法. [cpp] view plaincopy   static AccountManager *DefaultManager = nil; + ( ...

  4. iOS多线程中的单例

    #import "MyHandle.h" static MyHandle *handle = nil; @implementation MyHandle // 传统写法 // 此时 ...

  5. iOS开发——Swift篇&单例的实现

    Swift实现单例模式 Swift实现单例模式 由于Swift语言弱化了struct和class之间的界限,这里我分别给出自己写的两种的单例实现 class版本: class SwiftSinglet ...

  6. iOS开发——多线程OC篇&多线程中的单例

    多线程中的单例 #import "DemoObj.h" @implementation DemoObj static DemoObj *instance; // 在iOS中,所有对 ...

  7. IOS中的单例设计模式

    单例设计模式是IOS开发中一种很重要很常用的一种设计模式.它的设计原理是无论请求多少次,始终返回一个实例,也就是一个类只有一个实例.下面是苹果官方文档中关于单例模式的图片: 如图所示,左边的图是默认的 ...

  8. 在iOS开发中使用FMDB

    在iOS开发中使用FMDB 前言 SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库.iOS SDK 很早就支持了 SQLite,在使用时,只需 ...

  9. IOS:利用dispatch_once创建单例

    在之前有一篇学习笔记中,记载了一篇如何在OC中实现单例的文章:<IOS学习笔记4—Objective C—创建单例>自苹果引入了Grand Central Dispatch (GCD)(M ...

随机推荐

  1. Html笔记(十)XHTML XML

    XHTML 是可扩展的超文本标记语言(Extensible HyperText Markup Language). XHTML 是 w3c 组织在2000年的时候为了增强HTML推出的,本来是想替代H ...

  2. 【原创】Hadoop机架感知对性能调优的理解

    Hadoop作为大数据处理的典型平台,在海量数据处理过程中,其主要限制因素是节点之间的数据传输速率.因为集群的带宽有限,而有限的带宽资源却承担着大量的刚性带宽需求,例如Shuffle阶段的数据传输不可 ...

  3. HW5.8

    public class Solution { public static void main(String[] args) { System.out.printf("%s\t%s\t%s\ ...

  4. HW1.5

    public class Solution { public static void main(String[] args) { System.out.println("(9.5 * 4.5 ...

  5. .NET Compact Framework Data Provider for SQL Server CE

    .NET Compact Framework Data Provider for SQL Server Mobile Standard Data Source=MyData.sdf;Persist S ...

  6. Powerdesigner设置name与code不同时变化

    Tools-General Options-Dialog Name to Code mirroring去掉对勾

  7. NLog使用说明

    NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码. NLog允许我们自定义从跟踪消息的来源(source)到记录跟踪信息的目标(target)的规则 ...

  8. Effective Java:Ch4_Class:Item13_最小化类及其成员的可访问性

    要区别一个模块是否设计良好,最重要的因素是,对于其他模块而言该模块隐藏其内部数据和其他实现细节的程度.设计良好的模块应该隐藏所有实现细节,将API与其实现清晰地隔离开来.这样,模块之间通过他们的API ...

  9. Objective C assign&copy & retain区别

    什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Reference Counting). copy: 建立一个索引计数为1的对象,然后释放旧对象 re ...

  10. Caused by: java.lang.NoClassDefFoundError: freemarker/cache/TemplateLoader

    1.错误描写叙述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -he ...