iOS 开发中的单例

  

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

//  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

时间: 2024-10-13 08:33:43

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

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

最近在开发一个小的应用,遇到了一些Objective-c上面常用的单例模式,但是swift上面还是有一定区别的,反复倒来倒去发现不能按常理(正常的oc to swift的方式)出牌,因此搜索了一些帖子.可能是xcode或者sdk的问题吧(我相信他们不会把未经测试的代码展示,吧?...),一些帖子中的代码犯了明显的错误,编译失败.于是有了这篇文章,分享给大家. 原作者实现了一种单例,但是红色代码导致非线程安全: 1 class var sharedInstance:TPScopeManager {

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

最近在开发一个小的应用,遇到了一些Objective-c上面常用的单例模式,但是swift上面还是有一定区别的,反复倒来倒去发现不能按常理(正常的oc to swift的方式)出牌,因此搜索了一些帖子.可能是xcode或者sdk的问题吧(我相信他们不会把未经测试的代码展示,吧?...),一些帖子中的代码犯了明显的错误,编译失败.于是有了这篇文章,分享给大家. 原作者实现了一种单例,但是红色代码导致非线程安全: 1 class var sharedInstance:TPScopeManager {

iOS多线程中的单例

1 #import "MyHandle.h" 2 3 static MyHandle *handle = nil; 4 @implementation MyHandle 5 // 传统写法 6 // 此时如果多个任务并发执行,他就不会满足单例的优点 7 //+ (MyHandle *)shareMyHandle { 8 // if (nil == handle) { 9 // handle = [[MyHandle alloc] init]; 10 // } 11 // return

iOS开发设计模式之单例设计模式

单例设计模式 是一种常用的软件设计模式,保证系统中的一个类只有一个实例而且该实例易于被外界访问. 单例的英文:singleton,在数学中的含义是:有且仅有一个元素的集合. 如果希望系统中某个类的对象只能存在一个,单例模式是最好的解决方案 优点: 可以阻止其他对象实例化对象的副本,从而确保所有对象都访问唯一实例 缺点: 单例对象一旦创建,对象指针保存在全局静态区,而单例对象在堆中分配内存空间,在应用程序终止后才会被释放 使用到单例设计模式的类:(大部分用于管理系统的资源) UIApplicati

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

多线程中的单例 1 #import "DemoObj.h" 2 3 @implementation DemoObj 4 5 static DemoObj *instance; 6 7 8 9 // 在iOS中,所有对象的内存空间的分配,最终都会调用allocWithZone方法 10 // 如果要做单例,需要重写此方法 11 // GCD提供了一个方法,专门用来创建单例的 12 + (id)allocWithZone:(struct _NSZone *)zone 13 { 14 sta

IOS中的单例设计模式

单例设计模式是IOS开发中一种很重要很常用的一种设计模式.它的设计原理是无论请求多少次,始终返回一个实例,也就是一个类只有一个实例.下面是苹果官方文档中关于单例模式的图片: 如图所示,左边的图是默认的多例模式,只要发送请求去创建对象,就会得到一个新的对象:而右侧的图是单例模式,发送多个请求创建对象,但是最后返回的始终是同一个. 因为创建单例类的实例是在确保没有其他实例的情况下才创建的,并且在程序中使用的过程中始终是同一个实例,因此单例类可以作为提供一个全局访问资源的类,比如NSUserDefau

iOS中的单例你用对了?

单例模式怎么定义的,可能在不同的语言,不同的书中不完全一样,但是概况开来都应该是:一个类有且仅有一个实例,并且自行实例化向整个系统提供. 因此,首先你可能需要确定你是真的需要一个单例类,还是说仅仅是需要一个方便调用的实例化方法.如果你是真的需要一个单例类,那么你就应该确保这个单例类,有且仅有一个实例(不管怎么操作都只能获取到这个实例). 最近看到一些github上的单例使用,别人的用法,有一些思考,然后写demo测试了下,就这个简单的单例也有一些坑呢,希望能给他人一些提醒. Objective-

Swift中编写单例的正确方式

Swift中编写单例的正确方式 2015-12-07 10:23 编辑: yunpeng.hu 分类:Swift 来源:CocoaChina翻译活动 14 10647 Objective-CSwift单例 招聘信息: Cocos2d-x 工程师 cocos2dx手游客户端主程 wp开发 iOS开发工程师 iOS软件工程师 iOS研发工程师 iOS讲师 iOS开发工程师 iOS高级开发工程师 iOS 高级软件工程师 iOS高级开发工程师 本文由CocoaChina译者leon(社区ID)翻译自kr

iOS开发中常用的几种设计模式

下面是iOS开发中比较常用的几种设计模式.详情如下所示: (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求.列表row个数delegate自定义的delegate (二)观察者模式应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息.优势:解耦合敏捷原则:接口隔离原