谈一谈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应用开发中sandbox沙盒的使用

    简单掌握iOS应用开发中sandbox沙盒的使用

    这篇文章主要介绍了iOS应用开发中sandbox沙盒的使用,即将应用的存储区域单独隔离开来,开发时经常可以用到,需要的朋友可以参考下
    2016-01-01
  • iOS开发教程之常见的性能优化技巧

    iOS开发教程之常见的性能优化技巧

    这篇文章主要给大家介绍了关于iOS开发教程之常见的性能优化技巧,文中通过示例代码介绍的非常详细,对大家学习或者使用iOS具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • iOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-07-07
  • iOS UICollectionView实现卡片效果

    iOS UICollectionView实现卡片效果

    这篇文章主要为大家详细介绍了iOS UICollectionView实现卡片效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • iOS中UITextField实现过滤选中状态拼音的代码

    iOS中UITextField实现过滤选中状态拼音的代码

    这篇文章主要介绍了iOS中UITextField实现过滤选中状态拼音的代码,需要的朋友可以参考下
    2018-01-01
  • Xcode清理缓存和垃圾文件的教程

    Xcode清理缓存和垃圾文件的教程

    下面小编就为大家分享一篇Xcode清理缓存和垃圾文件的教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • 解决ios端点击按钮闪烁问题(小tips)

    解决ios端点击按钮闪烁问题(小tips)

    这篇文章主要介绍了ios端点击按钮闪烁的解决方法(小tips),需要的朋友参考下吧
    2017-10-10
  • 总结iOS实现渐变颜色的三种方法

    总结iOS实现渐变颜色的三种方法

    这篇文章主要给大家总结了iOS实现渐变颜色的三种方法,分别是利用CAGradientLayer实现渐变、Core Graphics相关方法实现渐变以及用CAShapeLayer作为layer的mask属性实现,大家可以根据自己的需要选择使用,下面来一起看看吧。
    2016-10-10
  • iOS UIScrollView和控制器返回手势冲突解决方法

    iOS UIScrollView和控制器返回手势冲突解决方法

    这篇文章主要介绍了iOS UIScrollView和控制器返回手势冲突解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • iOS 导航栏无缝圆滑的隐藏 Navigationbar实例代码

    iOS 导航栏无缝圆滑的隐藏 Navigationbar实例代码

    本文通过实例代码给大家介绍了iOS 导航栏无缝圆滑的隐藏 Navigationbar的效果,代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-11-11

最新评论