談一談iOS單例模式
單例模式是一種常用的軟件設(shè)計模式。在它的核心結(jié)構(gòu)中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統(tǒng)中一個類只有一個實例而且該實例易于外界訪問,從而方便對實例個數(shù)的控制并節(jié)約系統(tǒng)資源。如果希望在系統(tǒng)中某個類的對象只能存在一個,單例模式是最好的解決方案。
1、書寫步驟
1)、創(chuàng)建類方法,返回對象實例.以shared default current開頭。
2)、創(chuàng)建一個全局變量用來保存對象的引用
3)、判斷對象是否存在,若不存在,創(chuàng)建對象
2、具體單例模式的幾種模式
第一種單例模式
//非線程安全寫法 static UserHelper * helper = nil; + (UserHelper *)sharedUserHelper { if (helper == nil) { helper = [[UserHelper alloc] init]; } return helper; }
第二種單例模式
//線程安全寫法1 static UserHelper * helper = nil; + (UserHelper *)sharedUserHelper { @synchronized(self) { if (helper == nil) { helper = [[UserHelper alloc] init]; } } return helper; }
第三種單例模式
+ (void)initialize { if ([self class] == [UserHelper class]) { helper = [[UserHelper alloc] init]; } }
第四種單例模式
//線程安全寫法3(蘋果推薦,主要用這個) static UserHelper * helper = nil; + (UserHelper *)sharedUserHelper { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ helper = [[UserHelper alloc] init]; }); return helper; }
MRC全面實現(xiàn)單例寫法(了解)
#import <Foundation/Foundation.h> #import "UserHelper.h" void func() { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@"haha"); }); } int main(int argc, const char * argv[]) { @autoreleasepool { // [UserHelper logout]; if ([UserHelper isLogin]) { UserHelper * helper = [UserHelper sharedUserHelper]; NSLog(@"username = %@ password = %@",helper.userName,helper.password); } else { char name[20]; char pwd[20]; NSLog(@"請輸入用戶名"); scanf("%s",name); NSLog(@"請輸入密碼"); scanf("%s",pwd); NSString * userName = [[NSString alloc] initWithUTF8String:name]; NSString * password = [[NSString alloc] initWithUTF8String:pwd]; if (userName && password) { [UserHelper loginWithUserName:userName password:password]; UserHelper * helper = [UserHelper sharedUserHelper]; NSLog(@"username = %@ password = %@",helper.userName,helper.password); } } // UserHelper * help1 = [UserHelper sharedUserHelper]; // help1.userName = @"dahuan"; // help1.password = @"123456"; // NSLog(@"%p",help1); // NSLog(@"%@",help1.userName); // NSLog(@"%@",help1.password); // // // UserHelper * help2 = [UserHelper sharedUserHelper]; // help2.password = @"zxc"; // NSLog(@"%p",help2); // NSLog(@"%@",help1.userName); // NSLog(@"%@",help1.password); } return 0; } //class.h #import <Foundation/Foundation.h> @interface UserHelper : NSObject //1、創(chuàng)建類方法,返回對象實例 shared default current + (UserHelper *)sharedUserHelper; @property (nonatomic, copy) NSString * userName; @property (nonatomic, copy) NSString * password; + (BOOL)isLogin; + (void)loginWithUserName:(NSString *)userName password:(NSString *)password; + (void)logout; @end // class.m #import "UserHelper.h" //2、創(chuàng)建一個全局變量 #define Path @"/Users/dahuan/Desktop/data" static UserHelper * helper = nil; @implementation UserHelper //+ (void)initialize { // // if ([self class] == [UserHelper class]) { // helper = [[UserHelper alloc] init]; // } //} + (UserHelper *)sharedUserHelper { //3、判斷對象是否存在,若不存在,創(chuàng)建對象 //線程安全 // @synchronized(self) { // // if (helper == nil) { // helper = [[UserHelper alloc] init]; // } // } //gcd 線程安全 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ helper = [[UserHelper alloc] init]; }); return helper; } - (instancetype)init { if (self = [super init]) { NSString * data = [NSString stringWithContentsOfFile:Path encoding:NSUTF8StringEncoding error:nil]; if (data) { NSArray * array = [data componentsSeparatedByString:@"-"]; _userName = array[0]; _password = array[1]; } } return self; } + (BOOL)isLogin { UserHelper * helper = [UserHelper sharedUserHelper]; if (helper.userName && helper.password) { return YES; } return NO; } + (void)loginWithUserName:(NSString *)userName password:(NSString *)password { UserHelper * helper = [UserHelper sharedUserHelper]; helper.userName = userName; helper.password = password; NSArray * array = @[userName,password]; NSString * data = [array componentsJoinedByString:@"-"]; [data writeToFile:Path atomically:YES encoding:NSUTF8StringEncoding error:nil]; } + (void)logout { NSFileManager * fm = [NSFileManager defaultManager]; if ([fm fileExistsAtPath:Path]) { [fm removeItemAtPath:Path error:nil]; } } @end
以上就是關(guān)于iOS單例模式的全部內(nèi)容,希望對大家的學習有所幫助。
相關(guān)文章
iOS App設(shè)計模式開發(fā)中對建造者模式的運用實例
這篇文章主要介紹了iOS App設(shè)計模式開發(fā)中對建造者模式的運用實例,示例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-04-04解決JSON數(shù)據(jù)因為null導致數(shù)據(jù)加載失敗的方法
前段時間發(fā)現(xiàn)一個問題,當JSON數(shù)據(jù)中有null會導致數(shù)據(jù)加載失敗,后來解決了,現(xiàn)在將解決方法分享給大家,有同樣問題的朋友們可以參考。下面來一起看看吧。2016-09-09iOS實現(xiàn)點擊狀態(tài)欄自動回到頂部效果詳解
在IOS開發(fā)過程中,經(jīng)常會有這種需求,需要通過點擊狀態(tài)欄返回到頂部,給用戶更好的體驗效果,下面這篇文章給大家詳細介紹了實現(xiàn)過程,有需要的可以參考借鑒。2016-09-09iOS應(yīng)用開發(fā)中實現(xiàn)頁面跳轉(zhuǎn)的簡單方法筆記
這篇文章主要介紹了iOS應(yīng)用開發(fā)中實現(xiàn)頁面跳轉(zhuǎn)的簡單方法筆記,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-02-02ios基于MJRefresh實現(xiàn)上拉刷新和下拉加載動畫效果
本篇文章主要介紹了ios基于MJRefresh實現(xiàn)上拉刷新和下拉加載動畫效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08