单例的应用
首先问一下单例是什么?
其实单例是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。一般只要用到单例就会考虑线程安全问题(其实只要是应用程序开发都要考虑线程安全问题)。下面我们具体说一下把!
1.常见的第一中模式
.h文件中
1 #import <Foundation/Foundation.h> 2 3 @interface Singleton : NSObject 4 5 + (Singleton *)ShareIntance; 6 7 @end
.m文件中
1 #import "Singleton.h" 2 3 static Singleton *instance = nil; 4 5 @implementation Singleton 6 7 + (Singleton *)ShareIntance 8 { 9 if (instance == nil) { 10 11 instance = [[Singleton alloc] init]; 12 } 13 14 return instance; 15 } 16 17 @end
这种模式简单已写,但是线程不安全,无法避免多个用户同时访问给instance赋值。
2.常见的第二种模式 GCD方法
.h文件中
1 #import <Foundation/Foundation.h> 2 3 @interface Singleton : NSObject 4 5 + (Singleton *)ShareIntance; 6 7 @end
.m文件中
1 #import "Singleton.h" 2 3 static Singleton *instance = nil; 4 5 @implementation Singleton 6 7 + (Singleton *)ShareIntance 8 { 9 10 static dispatch_once_t onceToken; 11 12 dispatch_once(&onceToken, ^{ 13 14 instance = [[Singleton alloc] init]; 15 16 }); 17 18 19 return instance; 20 } 21 22 @end
这种写法满足了线程安全的要求,而且兼容ARC,是官方推荐使用。
3.还有常见的第三中模式 互拆锁
.h文件中
1 #import <Foundation/Foundation.h> 2 3 @interface Singleton : NSObject 4 5 + (Singleton *)ShareIntance; 6 7 @end
.m文件中
1 #import "Singleton.h" 2 3 static Singleton *instance = nil; 4 5 @implementation Singleton 6 7 + (Singleton *)ShareIntance 8 { 9 10 @synchronized(self) { 11 12 if (instance == nil) { 13 14 instance = [[Singleton alloc] init]; 15 } 16 } 17 18 return instance; 19 } 20 21 @end
这中模式也是线程安全的,但是比较繁琐,推荐还是使用GCD方法,方便、快捷。
博主自己所理解的也就这么多,希望对于小白有用吧!
在没有允许的情况下请勿转发,转发前请询问,转发时请注明出处!!!