在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. 如何使用C#和VB发送和接收MSMQ消息

    在这篇博客中,我们将就如何实现System.Messaging类发送和接收的XML消息发送从MSMQ队列,你可能会遇到接收的XML消息的一些问题. 我们将首先加入参考System.Messaging ...

  2. HW3.22

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  3. [置顶] 漫谈SOA(面向服务架构)

    面向服务架构的思想在整个软件的架构中已经不是什么新鲜的东西.我简单的认为服务化是模块化的延伸,所以服务化有着和模块化类似的优点和缺点.这里不再讨论这些服务定义服务与服务之间的通信协议(像WSDL等等) ...

  4. pycharm的使用技巧

    本文将持续更新一些关于在使用pycharm的过程中的小技巧: 多行缩进/取消缩进 选中需要更改的代码,按 shift + tab 多行注释/取消注释 选中需要更改的代码,按 ctrl  +  / 滚轮 ...

  5. js showModalDialog打开新的页面给原页面传值问题

    a.html中打开一个新页面b.html,b.html页面给a.html中的input传一个值并将value赋给input框. a.html: <html>  <head>   ...

  6. GridLookUpEdit 简单应用

    在属性列表中 Properties  -> view  即可打开设计器进行编辑 后台代码: DataTable dtt = stu.StuGetFind(sxml, 1, 50).Tables[ ...

  7. 【推荐】JAVA基础◆浅谈3DES加密解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  8. C#获取内存图像数据流的方法

    背景:有的时候我们已经得到一个图像的内存对象,如Bitmap对象,我们想要获取到这个对象的数据流,可以将其序列化到磁盘上,并且也可以反序列化为内存对象,这个时候就有了如题的问题出现,我搜遍全网就是没有 ...

  9. centos nginx install openssl

    1.查看是否已经安装 ssl 组件 [root@localhost wwwlogs]# cd /usr/local/nginx/sbin/ [root@localhost sbin]# ./nginx ...

  10. VisJS 随机图

    <!doctype html> <html> <head> <title>Random nodes</title> <style ty ...