第一、基本概念

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问。

第二、在IOS中使用单例模式的情况

1.如果说创建一个对象会耗费很多系统资源,那么此时采用单例模式,因为只需要一个实例,会节省alloc的时间

2.在IOS开发中,如果很多模块都要使用同一个变量,此时如果把该变量放入单例类,则所有访问该变量的调用变得很容易,否则,只能通过一个模块传递给另外一个模块,这样增加了风险和复杂度

第三、创建单例模式的基本步骤

1.声明一个单例对象的静态实例,并初始化为nil

2.声明一个类的工厂方法,生成一个该类的实例,并且只会生成一个

3.覆盖allcoWithZone方法,确保用户在alloc 时,不会产生一个多余的对象

4.实现NSCopying协议,覆盖release,autorelease,retain,retainCount方法,以确保只有一个实例化对象

5.在多线程的环境中,注意使用@synchronized关键字

//
//  UserContext.h
//  SingleDemo
//
//  Created by andyyang on 9/30/13.
//  Copyright (c) 2013 andyyang. All rights reserved.
//#import <Foundation/Foundation.h>@interface UserContext : NSObject
@property (nonatomic,retain) NSString *username;
@property(nonatomic,retain)NSString *email;
+(id)sharedUserDefault;
@end
//
//  UserContext.m
//  SingleDemo
//
//  Created by andyyang on 9/30/13.
//  Copyright (c) 2013 andyyang. All rights reserved.
//#import "UserContext.h"static UserContext *singleInstance=nil;
@implementation UserContext+(id)sharedUserDefault
{if(singleInstance==nil){@synchronized(self){if(singleInstance==nil){singleInstance=[[[self class] alloc] init];}}}return singleInstance;
}+ (id)allocWithZone:(NSZone *)zone;
{NSLog(@"HELLO");
if(singleInstance==nil)
{singleInstance=[super allocWithZone:zone];
}return singleInstance;
}
-(id)copyWithZone:(NSZone *)zone
{NSLog(@"hello");return singleInstance;
}
-(id)retain
{return singleInstance;
}
- (oneway void)release{
}
- (id)autorelease
{return singleInstance;
}- (NSUInteger)retainCount
{return UINT_MAX;
}@end
#import <Foundation/Foundation.h>
#import "UserContext.h"int main(int argc, const char * argv[])
{@autoreleasepool {UserContext *userContext1=[UserContext sharedUserDefault];UserContext *userContext2=[UserContext sharedUserDefault];UserContext *userContext3=[[UserContext alloc] init];UserContext *userContext4=[userContext1 copy];// insert code here...NSLog(@"Hello, World!");}return 0;
}

result:

IOS开发中单例模式使用详解相关推荐

  1. iOS 开发之照片框架详解

    一. 概要 在 iOS 设备中,照片和视频是相当重要的一部分.最近刚好在制作一个自定义的 iOS 图片选择器,顺便整理一下 iOS 中对照片框架的使用方法.在 iOS 8 出现之前,开发者只能使用 A ...

  2. IOS开发学习笔记-----UILabel 详解

    IOS开发学习笔记-----UILabel 详解 01 //创建uilabel 02 UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMa ...

  3. ios开发---URL Schemes 使用详解-app协议

    用原生 iOS 的人分两种,懂 URL Schemes 的和不懂的. 前者是「魔法师」,后者是「麻瓜」. URL Schemes 应用在 iOS 上已经很久了.对于使用者来说,在沙盒机制下的 iOS ...

  4. 状态机思路在嵌入式开发中的应用详解

    关注.星标公众号,直达精彩内容 ID:技术让梦想更伟大 整理:李肖遥 状态机的概念 状态机是软件编程中的一个重要概念.比这个概念更重要的是对它的灵活应用.在一个思路清晰而且高效的程序中,必然有状态机的 ...

  5. java中单例模式用法详解

    最近空闲的时候回顾了一下常用的设计模式,其中单例模式是创建型模式中比较基础的一种设计模式,说起单例模式,想必大家并不模式,我们都知道的是,在单例模式下,能够保证一个类只有一个实例对象,就是说,外部访问 ...

  6. iOS开发——frame和bounds详解

    在iOS的UI开发中,frame和bounds是两个非常容易搞混的概念,而很多开发者在实际项目中也很少去区分,因此会导致出现一些意想不到的问题.本篇博客以实际代码的方式来学习frame和bounds的 ...

  7. Python开发中的接口详解和使用方法

    在服务器环境实际开发过程中,往往要通过写接口来请求或者发送数据,那么到底什么是接口,如何通过调用接口发送或者请求数据呢? 一.接口的定义 简单来说,域名(地址)带上参数就是一个接口,然后通过调用此接口 ...

  8. iOS开发——深拷贝与浅拷贝详解

    深拷贝和浅拷贝这个问题在面试中常常被问到,而在实际开发中,只要稍有不慎,就会在这里出现问题.尤其对于初学者来说,我们有必要来好好研究下这个概念.我会以实际代码来演示,相关示例代码上传至 这里 . 首先 ...

  9. iOS开发那些事-Passbook详解与开发案例

    Passbook是iOS 6的新功能,只能在iPhone和iPod touch设备中使用.它可以帮助我们管理商家发放的电子会员卡.积分卡. 优惠券等.这将对未来电子商务产生深远的影响.商家通过发放会员 ...

最新文章

  1. 深入浅出Spring Security(二):FilterChainProxy的创建过程
  2. 极力推荐python初学者使用wingIDE
  3. OpenCV图像修补
  4. 卡方分布分位数_卡方检验和精确概率法及两两比较
  5. Python 主成分分析PCA
  6. java 单例 读写锁_终极锁实战:单JVM锁+分布式锁
  7. java解析带斜杠的参数_Java Spring MVC应用程序仅接受带有斜杠的POST请求
  8. ASP.NET中的两个Cookie类:HttpCookie类与Cookie类
  9. 面向对象编程设计练习题(1)
  10. 学习苹果Swift语言的一些在线资源
  11. python读取数据库数据类型_从SQL数据库读取二进制数据(图像数据类型)并将其膨胀,Matlab vs.Python...
  12. ai快捷键常用表_掌握这些AI常用快捷键和小技巧,提高速度
  13. 2018年腾讯笔试题(今年更难了)
  14. 惯性系统常用坐标系_惯性导航技术中,NEU是什么坐标系?
  15. 2013武汉住房公积金新政详解
  16. JVM 为什么使用元空间替换了永久代?
  17. C++课程设计:学生管理系统
  18. Discuz_分类信息_字段管理_区域选择_所有地区
  19. 如何使用文件保险箱加密 Mac 数据?
  20. idea 断点debug没有勾勾,导致调试无效

热门文章

  1. 有限单元法基本原理和数值方法_有限元法分析结果的四类误差,你知道吗?
  2. python 特性和方法同名_Python类:方法与属性同名
  3. MySQL中类似ORACLE中decode()判断语句实现
  4. vue2.0 watch的注意事项
  5. 如何制作Vuejs组件,并且在项目中使用
  6. 全局处理ajax请求时session超时
  7. 解决413 Request Entity Too Large
  8. IndexedDB使用(基本函数封到Angular2的service里)
  9. Centos/ubuntu配置SVN服务
  10. 怎样把开启的服务放到后台?