基本概念:

       單例設(shè)計模式是運(yùn)用較為普遍,廣泛且較為簡單的設(shè)計模式之一,它的設(shè)計原理是

始終返回一個實例,即一個類始終只有一個實例

【Objective-C】OC中單例設(shè)計模式講解

創(chuàng)建單例設(shè)計模式的基本步驟

      1:聲明一個單例對象的靜態(tài)實例,并初始化為nil

      2:創(chuàng)建一個類的類方法,生成一個該類的實例,當(dāng)且僅有這個類實例nil時,進(jìn)行實例化

      3:覆蓋allocWithZone:方法,確保用戶直接分配和初始化的事后,不會產(chǎn)生新的對象

      4:實現(xiàn)NSCopying協(xié)議,覆蓋release,autorelease,retain,retainCount方法,以此確保單例的狀態(tài)

      5:在多線程的環(huán)境中,注意要使用@synchronized關(guān)鍵字,確定靜態(tài)實例被正確和初始化


單例的基本實現(xiàn):

實例,UserContext.h頭文件:

#import <Foundation/Foundation.h>  @interface UserContext : NSObject <NSCopying> @property(nonatomic,copy)NSString *name; @property(nonatomic,copy)NSString *email;  //單例 類方法 +(id)shareUserContext; @end
UserContext.m實現(xiàn)文件:

#import "UserContext.h" //單例對象 static UserContext *sigletonInstance=nil; @implementation UserContext //生成單例對象 +(id)shareUserContext{     @synchronized(self){     if (sigletonInstance==nil) {         sigletonInstance=[[[self class] alloc]init];        }     }     return sigletonInstance; } //下面的方法確保只有一個實例對象 +(id)allocWithZone:(NSZone *)zone{     if (sigletonInstance==nil) {         sigletonInstance=[super allocWithZone:zone];     }     return  sigletonInstance; } -(id)copyWithZone:(NSZone *)zone{     return  sigletonInstance; } -(id)retain{      return  sigletonInstance; } -(oneway void)release{      } -(id)autorelease{     return  sigletonInstance; } -(NSUInteger)retainCount{     return UINT_MAX; } @end
main.m測試代碼:

#import <Foundation/Foundation.h> #import "UserContext.h" int main(int argc, const char * argv[]) {      @autoreleasepool {         UserContext *userContext1=[UserContext shareUserContext];         UserContext *userContext2=[UserContext shareUserContext];         UserContext *userContext3=[[UserContext alloc]init];         UserContext *userContext4=[userContext3 copy];         [userContext1 release];         [userContext1 release];         [userContext1 release];         [userContext1 release];         NSLog(@" ");     }     return 0; }
運(yùn)行截圖

【Objective-C】OC中單例設(shè)計模式講解

看上面四個對象的內(nèi)存地址一樣,說明這四個對象為同一個對象。這樣就可以實現(xiàn)單例了。