谈一谈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
单例模式
ios单例模式、ios单例模式应用场景、ios开发单例模式、ios 用户登录单例模式、ios单例模式的好处,以便于您获取更多的相关知识。

时间: 2024-12-28 07:08:03

谈一谈iOS单例模式_IOS的相关文章

中国手游1500万获《指上谈兵》IOS及安卓平台国内地区独家代理权

今日,中国首家纳斯达克上市手机游戏公司CMGE中国手游(NASDAQ:CMGE)确认,以1500万元人民币价格获得骏梦全球首款即时战斗三国手游<指上谈兵>IOS及安卓平台国内地区独家代理权,并由旗下发行团队豆玩游戏负责在IOS及安卓平台国内地区独家发行与运营,同时放出游戏首部高清实录宣传片.中国手游豆玩游戏总裁 梅孝龙先生与 骏梦游戏CEO许斌签约后握手留念<指上谈兵>作为上海骏梦进军手机游戏市场的首款作品,创新推出2D即时战斗策略玩法,首创半即时制战斗操作,玩家进入战斗场景后可以

谈一谈各种语言的“整装儿”的感觉

谈一谈各种语言的"整装儿"的感觉 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. "整装儿" 是个东北方言,意思就是很紧凑,很成型,不散乱,结构清晰, 或

谈一谈网络编程学习经验

建议大家去看原文:http://cloud.github.com/downloads/chenshuo/documents/LearningNetworkProgramming.pdf 1 谈一谈网络编程学习经验 陈硕 giantchen@gmail.com blog.csdn.net/Solstice weibo.com/giantchen 2012-02-13 本文谈一谈我在学习网络编程方面的一些个人经验."网络编程"这个术语的范围很广,本文指用 Sockets API 开发基于

谈一谈SQL Server中的执行计划缓存(下)

原文:谈一谈SQL Server中的执行计划缓存(下) 简介     在上篇文章中我们谈到了查询优化器和执行计划缓存的关系,以及其二者之间的冲突.本篇文章中,我们会主要阐述执行计划缓存常见的问题以及一些解决办法.   将执行缓存考虑在内时的流程     上篇文章中提到了查询优化器解析语句的过程,当将计划缓存考虑在内时,首先需要查看计划缓存中是否已经有语句的缓存,如果没有,才会执行编译过程,如果存在则直接利用编译好的执行计划.因此,完整的过程如图1所示. 图1.将计划缓存考虑在内的过程      

谈一谈SQL Server中的执行计划缓存(上)

原文:谈一谈SQL Server中的执行计划缓存(上) 简介     我们平时所写的SQL语句本质只是获取数据的逻辑,而不是获取数据的物理路径.当我们写的SQL语句传到SQL Server的时候,查询分析器会将语句依次进行解析(Parse).绑定(Bind).查询优化(Optimization,有时候也被称为简化).执行(Execution).除去执行步骤外,前三个步骤之后就生成了执行计划,也就是SQL Server按照该计划获取物理数据方式,最后执行步骤按照执行计划执行查询从而获得结果.但查询

谈一谈如何让老网站在百度更新中越来越稳

摘要: 每次百度更新总会有一部分网站倒下,这让很多老站长都感觉百度无情,其实作为百度搜索引擎而言他更多的是考虑用户的利益,而对于一些老网站被降权或者被K的行为都是由于网站自 每次百度更新总会有一部分网站倒下,这让很多老站长都感觉百度无情,其实作为百度搜索引擎而言他更多的是考虑用户的利益,而对于一些老网站被降权或者被K的行为都是由于网站自身不足引起的,而想要自己的网站在百度中趋于稳定,那么就必须改变建站思路与建站方法,下面我们详细的谈一谈如何让老网站在百度更新中越来越稳. 改变外链质量应当以稳定和

【dotnet跨平台】谈一谈dotnet-cli开源社区的产品持续集成

 [dotnet跨平台]谈一谈dotnet-cli开源社区的产品持续集成 进入其中一个PR:https://github.com/dotnet/cli/pull/2580 可以看到微软使用自己搭建的持续集成平台来保证产品和代码的质量,其中每一个即将整合代码到rel/1.0.0这个主分支的代码都要经过7个测试通过,其中2个windows平台,4个linux平台和一个OS X平台如下: Details Windows_NT x64 Release Build - Build finished.

谈一谈页面标题的优化

标题的优化一直是老生常谈的问题了,虽然标题的优化只是内部优化的小小的一部分,但是如果连这个很小的部分都无法合理的优化那何谈全站的优化呢?SEO优化就是从这些小的细节出发从而达到优化的全体效果.页面标题(title)的优化是最基础也是最重要的,它在所有页面元素优化中占有举足轻重的地位. 下面就跟大家详细的谈一谈页面标题的优化:        一.TLTLE的作用       1.Title的设置直接影响到我们的预设排名时间,也就是说在同等资源的条件下,我们优化时间的长短跟标题中放置什么关键词以及放

谈一谈Http Request 与 Http Response

原文:谈一谈Http Request 与 Http Response 写在前面的话:最近帮朋友弄弄微信商城,对于微信的基础开发,基本上就是各种post.get,有时是微信服务器向我们的服务器post.get数据,有时需要我们自己的服务器向微信服务器各种post.get,之间通过json或者xml传送数据.今天就来总结一下http相关的request和response,就从以下几个问题入手吧. ======正文开始======== 1.什么是HTTP Request 与HTTP Response?