談一談iOS單例模式_IOS

來源:互聯網
上載者:User

單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個執行個體而且該執行個體易於外界訪問,從而方便對執行個體個數的控制並節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。

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單例模式的全部內容,希望對大家的學習有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.