ios什么是單例
時(shí)間:
歐東艷656由 分享
ios什么是單例
單例模式是ios里面經(jīng)常使用的模式,例如
[UIApplicationsharedApplication] (獲取當(dāng)前應(yīng)用程序?qū)ο?、[UIDevicecurrentDevice](獲取當(dāng)前設(shè)備對(duì)象);
單例模式的寫法也很多。
第一種:
- static Singleton *singleton = nil;
- // 非線程安全,也是最簡(jiǎn)單的實(shí)現(xiàn)
- + (Singleton *)sharedInstance
- {
- if (!singleton) {
- // 這里調(diào)用alloc方法會(huì)進(jìn)入下面的allocWithZone方法
- singleton = [[self alloc] init];
- }
- return singleton;
- }
- // 這里重寫allocWithZone主要防止[[Singleton alloc] init]這種方式調(diào)用多次會(huì)返回多個(gè)對(duì)象
- + (id)allocWithZone:(NSZone *)zone
- {
- if (!singleton) {
- NSLog(@"進(jìn)入allocWithZone方法了...");
- singleton = [super allocWithZone:zone];
- return singleton;
- }
- return nil;
- }
第二種:
- // 加入線程安全,防止多線程情況下創(chuàng)建多個(gè)實(shí)例
- + (Singleton *)sharedInstance
- {
- @synchronized(self)
- {
- if (!singleton) {
- // 這里調(diào)用alloc方法會(huì)進(jìn)入下面的allocWithZone方法
- singleton = [[self alloc] init];
- }
- }
- return singleton;
- }
- // 這里重寫allocWithZone主要防止[[Singleton alloc] init]這種方式調(diào)用多次會(huì)返回多個(gè)對(duì)象
- + (id)allocWithZone:(NSZone *)zone
- {
- // 加入線程安全,防止多個(gè)線程創(chuàng)建多個(gè)實(shí)例
- @synchronized(self)
- {
- if (!singleton) {
- NSLog(@"進(jìn)入allocWithZone方法了...");
- singleton = [super allocWithZone:zone];
- return singleton;
- }
- }
- return nil;
- }
第三種:
- __strong static Singleton *singleton = nil;
- // 這里使用的是ARC下的單例模式
- + (Singleton *)sharedInstance
- {
- // dispatch_once不僅意味著代碼僅會(huì)被運(yùn)行一次,而且還是線程安全的
- static dispatch_once_t pred = 0;
- dispatch_once(&pred, ^{
- singleton = [[super allocWithZone:NULL] init];
- });
- return singleton;
- }
- // 這里
- + (id)allocWithZone:(NSZone *)zone
- {
- /* 這段代碼無法使用, 那么我們?nèi)绾谓鉀Qalloc方式呢?
- dispatch_once(&pred, ^{
- singleton = [super allocWithZone:zone];
- return singleton;
- });
- */
- return [self sharedInstance];
- }
- - (id)copyWithZone:(NSZone *)zone
- {
- return self;
- }