單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個執行個體而且該執行個體易於外界訪問,從而方便對執行個體個數的控制並節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。
1、書寫步驟
1)、建立類方法,返回對象執行個體.以shared default current開頭。
2)、建立一個全域變數用來儲存對象的引用
3)、判斷對象是否存在,若不存在,建立對象
2、具體單例模式的幾種模式
第一種單例模式
//非安全執行緒寫法static UserHelper * helper = nil;+ (UserHelper *)sharedUserHelper {if (helper == nil) {helper = [[UserHelper alloc] init];} return helper;}
第二種單例模式
//安全執行緒寫法1static 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全面實現單例寫法(瞭解)
#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、建立類方法,返回對象執行個體 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、建立一個全域變數 #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、判斷對象是否存在,若不存在,建立對象 //安全執行緒// @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
以上就是關於iOS單例模式的全部內容,希望對大家的學習有所協助。