單例設計模式

iOS之單例設計模式

單例

單:惟一性。例:實例對象。就是使用某個類建立的對象是程序中惟一的實例對象。(一般每次使用alloc建立的是不一樣的對象)web

若是一個類只能建立一個對象,稱爲單例類,能夠工具類,視圖類,控制器類設計模式

特色:全局均可以被訪問到,操做單例對象的變量不會被釋放,每次獲取的對象都是同一個對象,只建立一次多線程

建立:建立單例對象的方法,通常都爲類方法,命名規則爲share+類名 或者 standard+類名工具

注意: (1)操做單例對象的變量存儲在靜態區,程序關閉後由系統自動回收 (2)單例對象存儲在堆區,不釋放,程序關閉後由系統自動回收 (3)變量與單例對象的生命週期與程序同步性能

優點: (1)在內存中只有一個對象,節省內存空間 (2)避免頻繁的建立銷燬對象,能夠提升性能 (3)避免對共享資源的多重佔用 (4)能夠全局訪問 (5)下降模塊之間的藕合度,下降代碼的複雜度spa

僞單例與完整單例

根據須要咱們實現的單例有僞單例和完整單例兩種:線程

僞單例:只有經過該方法獲取到的纔是同一對象,通常狀況下咱們本身的單例類多采用僞單例的建立方式,不須要實現完整的單例設計

@implementation DataHandle
static DataHandle *handle = nil;

+(DataHandle *)shareInstance
{
    //@synchronized爲同步鎖,在該大括號的代碼段在多線程的時候受保護,一次只可以有一個線程執行,當多個線程訪問改單例的時候,後面的等待!!!
    @synchronized(self){
        if(nil == handle)//判斷以前是否開闢了空間
        {
            //當建立完整的單例,要避免死循環的問題
            handle = [[DataHandle alloc]init];
        }
    }
    return handle;
}

完整單例:不只經過特定方法獲取到的是同一對象,進行alloc copy mutlcopy獲取到的也是同一個對象,就須要咱們重寫這些方法作一些內部實現code

例如:SingleTon爲單例名對象

static SingleTon *singleTon = nil;
+(SingleTon *)shareSingleTon
{
    @sychronized{
        if(singleTon == nil)
        {
            singleTon = [super allocWithZone:nil]init];
        }
    }
}
+ (instancetype)alloc
{
        return [SingleTon shareSingTon];
}


+(instancetype)allocWithZone:(struct _NSZone *)zone
{
    return [SingleTon shareSingTon];
}

-(id)copy
{
    return [SingleTon shareSingTon];
}

-(id)mutableCopy
{
    return [SingleTon shareSingTon];
}
-(oneway void)release
{
    //    返回值爲空,不作任何操做
}

-(NSUInteger)retainCount
{
    //    返回整形最大數
    return NSUIntegerMax;
}
相關文章
相關標籤/搜索