谈一谈iOS单例模式

 更新时间:2016年05月11日 16:46:13   作者:彭盛凇  
这篇文章主要和大家谈一谈iOS中的单例模式,单例模式是一种常用的软件设计模式,想要深入了解iOS单例模式的朋友可以参考一下

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

1、书写步骤

1)、创建类方法,返回对象实例.以shared  default current开头。
2)、创建一个全局变量用来保存对象的引用
3)、判断对象是否存在,若不存在,创建对象

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全面实现单例写法(了解)

#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单例模式的全部内容,希望对大家的学习有所帮助。

相关文章

  • iOS开发之tableView实现左滑删除功能

    iOS开发之tableView实现左滑删除功能

    我们在使用一些应用的时候,在滑动一些联系人的某一行的时候,会出现删除、置顶、更多等等的按钮,下面这篇文章主要就介绍了iOS用tableView实现左划删除功能的方法,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • iOS自动移除KVO观察者的实现方法

    iOS自动移除KVO观察者的实现方法

    在 Apple 的应用开发里 KVO 提供了一个途径,使对象(观察者)能够观察其他对象(被观察者)的属性,当被观察者的属性发生变化时,观察者就会被告知该变化。下面这篇文章主要给大家介绍了关于iOS如何自动移除KVO观察者的实现方法,需要的朋友可以参考下。
    2017-12-12
  • iOS开发常用线程安全锁

    iOS开发常用线程安全锁

    这篇文章主要为大家介绍了iOS开发常用线程安全锁示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • iOS模糊效果的实现方法

    iOS模糊效果的实现方法

    这篇文章主要为大家详细介绍了iOS模糊效果的实现方法,利用系统的CoreImage滤镜、UIImage ImageEffects分类和UIVisualEffectView实现模糊效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • IOS设置按钮为圆角的示例代码

    IOS设置按钮为圆角的示例代码

    这篇文章给大家分享了IOS按钮设置为圆角的方法,按钮的四个角都可随意设置为圆角,对大家开发IOS具有一定的参考借鉴价值。有需要的朋友们可以参考借鉴。
    2016-09-09
  • iOS使用自带的UIViewController实现qq加号下拉菜单的功能(实例代码)

    iOS使用自带的UIViewController实现qq加号下拉菜单的功能(实例代码)

    这篇文章主要介绍了iOS使用自带的UIViewController实现qq加号下拉菜单的功能(实例代码),需要的朋友可以参考下
    2017-05-05
  • iOS APP签名机制原理详解

    iOS APP签名机制原理详解

    这篇文章主要介绍了iOS APP签名机制原理详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • iOS10推送之基础知识(必看篇)

    iOS10推送之基础知识(必看篇)

    相信每位iOS开发者们都知道,在iOS10更新之后,推送也是做了一些小小的修改,下面我就给大家仔细说说iOS10的推送,有需要的朋友们可以参考借鉴。下面来一起看看吧。
    2016-09-09
  • iOS实现锁屏页面控制音乐播放

    iOS实现锁屏页面控制音乐播放

    这篇文章主要为大家详细介绍了iOS实现锁屏页面控制音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • IOS在SwiftUI中显示模态视图的实例代码

    IOS在SwiftUI中显示模态视图的实例代码

    这篇文章主要介绍了IOS在SwiftUI中显示模态视图的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02

最新评论