OC:單例模式(Singleton)??

  • 版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。

單例模式的意思就是只有一個實例。單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。這個類稱為單例類。

1.單例模式的要點:

顯然單例模式的要點有三個;一是某個類只能有一個實例;二是它必須自行創(chuàng)建這個實例;三是它必須自行向整個系統(tǒng)提供這個實例。

2.單例模式的優(yōu)點:

1.實例控制:Singleton 會阻止其他對象實例化其自己的 Singleton 對象的副本,從而確保所有對象都訪問唯一實例。
  2.靈活性:因為類控制了實例化過程,所以類可以更加靈活修改實例化過程

iOS中的單例模式

  • 在objective-c中要實現(xiàn)一個單例類,至少需要做以下四個步驟:

1、為單例對象實現(xiàn)一個靜態(tài)實例,并初始化,然后設(shè)置成nil,
  
2、實現(xiàn)一個實例構(gòu)造方法檢查上面聲明的靜態(tài)實例是否為nil,如果是則新建并返回一個本類的實例,
  
3、重寫allocWithZone方法,用來保證其他人直接使用alloc和init試圖獲得一個新實力的時候不產(chǎn)生一個新實例,
  
4、適當(dāng)實現(xiàn)allocWitheZone,copyWithZone,release和autorelease。

  • 下面以SurveyRunTimeData為例子:
static MyClass *class = nil;  
  
@implementation MyClass  
  
+(MyClass *)sharedMyClass{  
    @synchronized(self){  //為了確保多線程情況下,仍然確保實體的唯一性  
        if (!class) {  
            [[self alloc] init]; //該方法會調(diào)用 allocWithZone  
        }  
    }  
    return class;  
}  
+(id)allocWithZone:(NSZone *)zone{  
    @synchronized(self){// //為了確保多線程情況下,仍然確保實體的唯一性  
        if (!class) {  
            class = [super allocWithZone:zone]; //確保使用同一塊內(nèi)存地址  
            return class;  
        }  
    }  
    return nil;  
}  
  
-(id)init  
{  
  if(class){  
     return class;  
  }  
  if(self = [super init]){  
   //進(jìn)行一些初始化  
   }  
   return self ;  
}   
- (id)copyWithZone:(NSZone *)zone;{  
    return self; //確保copy對象也是唯一  
}  
  
-(id)retain{  
    return self; //確保計數(shù)唯一  
}  
  
- (unsigned)retainCount  
{  
   return UINT_MAX;  //裝逼用的,這樣打印出來的計數(shù)永遠(yuǎn)為-1  
}  
  
- (id)autorelease  
{  
    return self;//確保計數(shù)唯一  
}   
  
- (oneway void)release  
{  
     //重寫計數(shù)釋放方法 do nothing  
}  
@end  ```

 >再調(diào)試

MyClass *A = [[MyClass alloc] init];

NSLog(@"A:%@",A);

MyClass *B = [MyClass sharedMyClass];

NSLog(@"B:%@",B);

MyClass *C = [A copy];

NSLog(@"C:%@",C);```

打印出的是

A:<MyClass: 0x6a1e130>

B:<MyClass: 0x6a1e130>

C:<MyClass: 0x6a1e130>```

>都是指向同一塊內(nèi)存地址


- 然而這個人(<http://eschatologist.net/blog/?p=178>)覺的繁瑣,所以給出如下實現(xiàn):

@interface SomeManager : NSObject

  • (id)sharedManager;
    @end

/* 非線程安全的實現(xiàn) */
@implementation SomeManager

  • (id)sharedManager {
    static id sharedManager = nil;

    if (sharedManager == nil) {
    sharedManager = [[self alloc] init];
    }

    return sharedManager;
    }
    @end

/* 線程安全的實現(xiàn) */
@implementation SomeManager

static id sharedManager = nil;

  • (void)initialize {
    if (self == [SomeManager class]) {
    sharedManager = [[self alloc] init];
    }
    }

  • (id)sharedManager {
    return sharedManager;
    }
    @end ```

自蘋果引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0)后,利用GCD(Grand Central Dispatch)ARC(Automatic Reference Counting)實現(xiàn)單例。

+(SchoolManager *)sharedInstance  
{  
    __strong static SchoolManager *sharedManager;  
      
    static dispatch_once_t onceToken;  
    dispatch_once(&onceToken, ^{  
        sharedManager = [[SchoolManager alloc] init];  
    });  
      
    return sharedManager;  
}  ```


>函數(shù)void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);其中第一個參數(shù)predicate,該參數(shù)是檢查后面第二個參數(shù)所代表的代碼塊是否被調(diào)用的謂詞,第二個參數(shù)則是在整個應(yīng)用程序中只會被調(diào)用一次的代碼塊。dispach_once函數(shù)中的代碼塊只會被執(zhí)行一次,而且還是線程安全的。

看到如下一篇文章,用宏實現(xiàn)(<https://gist.github.com/lukeredpath/1057420>):

//ExampleClass.m
@implementation MySharedThing

  • (id)sharedInstance
    {
    DEFINE_SHARED_INSTANCE_USING_BLOCK(^{
    return [[self alloc] init];
    });
    }

@end

GCDSingleton.h

define DEFINE_SHARED_INSTANCE_USING_BLOCK(block)

static dispatch_once_t pred = 0;
__strong static id _sharedObject = nil;
dispatch_once(&pred, ^{
_sharedObject = block();
});
return _sharedObject;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、單例是什么?(apl??ke??(?)n 申請) 在 Foundation 和 Application Kit...
    甘哲157閱讀 6,275評論 6 22
  • 單例模式 什么是單例模式? 單例模式想一個大獨裁者,他規(guī)定在他的國度里面,所有數(shù)據(jù)的訪問和請求都得經(jīng)過他,甚至你要...
    GitHubPorter閱讀 1,263評論 0 4
  • 單例模式(SingletonPattern)一般被認(rèn)為是最簡單、最易理解的設(shè)計模式,也因為它的簡潔易懂,是項目中最...
    成熱了閱讀 4,536評論 4 34
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 1 這一年的秋天來得很突然。章邯將軍叛秦降楚的消息傳來后,咸陽北郊的望夷宮里,頭一天還紅著綠著的花花草草,一夜之間...
    風(fēng)流人物志閱讀 1,199評論 4 12

友情鏈接更多精彩內(nèi)容