iOS学习之单例模式
单例模式(Singleton)
概念:整个应用或系统只能有该类的一个实例
在iOS开发我们经常碰到只需要某类一个实例的情况,最常见的莫过于对硬件参数的访问类,比如UIAccelerometer.这个类可以帮助我们获得硬件在各个方向轴上的加速度,但是我们仅仅需要它的一个实例就够了,再多,只会浪费内存。
苹果大量使用了此模式。例如:[NSUserDefaults standardUserDefaults], [UIApplication sharedApplication], [UIScreen mainScreen], [NSFileManager defaultManager],所有的这些方法都返回一个单例对象。
- UIApplication类提供了 +sharedAPplication方法创建和获取UIApplication单例
- NSBundle类提供了 +mainBunle方法获取NSBundle单例
- NSFileManager类提供了 +defaultManager方法创建和获得NSFileManager单例。(PS:有些时候我们得放弃使用单例模式,使用-init方法去实现一个新的实例,比如使用委托时)
- NSNotificationCenter提供了 +defaultCenter方法创建和获取NSNotificationCenter单例(该类还遵循了另一个重要的设计模式:观察者模式)
- NSUserDefaults类提供了 +defaultUserDefaults方法去创建和获取NSUserDefaults单例
创建单例模式的五个步骤:
- 声明一个可以新建和获取单个实例对象的方法
- 声明一个static类型的类变量
- 声明一个只执行一次的任务
- 调用dispatch_once执行该任务指定的代码块,在该代码块中实例化上文声明的类变量
- 返回在整个应用的生命周期中只会被实例化一次的变量
下面用代码呈现:
//Singleton.h
@interface Singleton : NSObject
+ (Singleton *)sharedSingleton; //1声明一个可以新建和获取单个实例对象的方法
@end
/***************************************************************/
//Singleton.m
#import "Singleton.h"
@implementation Singleton
static Singleton *sharedSingleton = nil;// 2声明一个static类型的类变量
+ (Singleton *)sharedSingleton{
static dispatch_once_t once; //3声明一个只执行一次的任务
dispatch_once(&once,^{
sharedSingleton = [[self alloc] init];// 调用dispatch_once执行该任务指定的代码块,在该代码块中实例化上文声明的类变量
//dosometing
});
return sharedSingleton;// 返回在整个应用的生命周期中只会被实例化一次的变量(不止调用一次,但是只实例化一次)
}
实际运用:在iOS应用中实现分层的架构设计,即我们需要把数据持久层,业务逻辑层,和展示层分开。(PersistenceLayer、 BusinessLogiclayer 、 PresentationLayer)
根据MVC的设计模式,我们又可以把持久层细分为DAO层(放置访问数据对象的四类方法-增删改查)和Domain层(各种实体类,比如日期,文本内容等)(DAO:Data Access Object数据访问对象是一个面向对象的接口)
实现:封装一个单例,用于初始化路径,文件等
// NoteDAO.h
#import <Foundation/Foundation.h>
#import "Note.h"
@interface NoteDAO : NSObject
+ (NoteDAO*)sharedInstance;
//插入Note方法
-(int) create:(Note*)model;
//删除Note方法
-(int) remove:(Note*)model;
//修改Note方法
-(int) modify:(Note*)model;
//查询所有数据方法
-(NSMutableArray*) findAll;
//按照主键查询数据方法
-(Note*) findById:(Note*)model;
@end
// NoteDAO.m
#import "NoteDAO.h"
@interface NoteDAO() //声明NoteDAO扩展
//NoteDAO扩展中DateFormatter属性是私有的
@property (nonatomic,strong) NSDateFormatter *dateFormatter;
// NoteDAO扩展中沙箱目录中属性列表文件路径是私有的(所以不放在.h文件中声明)
@property (nonatomic,strong) NSString *plistFilePath;
@end
@implementation NoteDAO
static NoteDAO *sharedSingleton = nil;
+ (NoteDAO *)sharedInstance {
static dispatch_once_t once;
dispatch_once(&once, ^{
sharedSingleton = [[self alloc] init];
//初始化沙箱目录中属性列表文件路径
sharedSingleton.plistFilePath = [sharedSingleton applicationDocumentsDirectoryFile];
//初始化DateFormatter
sharedSingleton.dateFormatter = [[NSDateFormatter alloc] init];
[sharedSingleton.dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
//初始化属性列表文件
[sharedSingleton createEditableCopyOfDatabaseIfNeeded];
});
return sharedSingleton;
}
//初始化属性列表文件
- (void)createEditableCopyOfDatabaseIfNeeded {
。。。
}
- (NSString *)applicationDocumentsDirectoryFile {
}
- (int)create:(Note *)model {
。。。
}
-(NSMutableArray*) findAll{
}
在业务逻辑层使用这个单例
// NoteBL.m
#import "NoteBL.h"
@implementation NoteBL
//插入Note方法
-(NSMutableArray*) createNote:(Note*)model {
NoteDAO *dao = [NoteDAO sharedInstance];
[dao create:model];
return [dao findAll];
}
iOS学习之单例模式的更多相关文章
- ios 学习路线总结
学习方法 面对有难度的功能,不要忙着拒绝,而是挑战一下,学习更多知识. 尽量独立解决问题,而不是在遇到问题的第一想法是找人. 多学习别人开源的第三方库,能够开源的库一定有值得学习的地方,多去看别的大神 ...
- iOS学习笔记13-网络(二)NSURLSession
在2013年WWDC上苹果揭开了NSURLSession的面纱,将它作为NSURLConnection的继任者.现在使用最广泛的第三方网络框架:AFNetworking.SDWebImage等等都使用 ...
- iOS学习-压缩图片(改变图片的宽高)
压缩图片,图片的大小与我们期望的宽高不一致时,我们可以将其处理为我们想要的宽高. 传入想要修改的图片,以及新的尺寸 -(UIImage*)imageWithImage:(UIImage*)image ...
- 【原】iOS学习之事件处理的原理
在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理 1.UITouch对象 在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢? ( ...
- iOS学习笔记——AutoLayout的约束
iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...
- ios 开发之单例模式
在iOS开发中,有很多地方都选择使用单例模式.有很多时候必须要创建一个对象,并且不能创建多个,用单例就为了防止创建多个对象.单例模式的意思就是某一个类有且只有一个实例.单例模式确保某一个类只有一个实例 ...
- 【原】iOS学习47之第三方-FMDB
将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...
- iOS学习路线图
一.iOS学习路线图 二.iOS学习路线图--视频篇 阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天 学习后目标: ...
- 黑苹果-IOS学习的开始
深知安装黑苹果的不易,在这里写一下关于我的Thinkpad E430c安装黑苹果教程(Mac版本:Yosemite 10.10.4),希望能够帮助有需要的朋友. 首先贴上我的电脑配置报表: ----- ...
随机推荐
- python3 函数的形参、实参、位置参数、默认参数、关键字参数以及函数的递归
python 版本 3.5 #Author by Andy#_*_ coding:utf-8 _*_def func(x,y=2): print('我是形参%s'%x) print('我是默认参y-- ...
- Eclipse WTP Tomcat hot deploy
转自: http://ducquoc.wordpress.com/2010/11/06/eclipse-wtp-tomcat-hot-deploy/ One of the reasons why Ja ...
- Mybatis + Mysql 插入数据时中文乱码问题
近日跟朋友一起建立一个项目,用的是spring+mybatis+mysql. 今天碰到一个mybatis向mysql中插入数据时,中文显示为'???'的问题,拿出来说下. 对于数据库操作中出现的中文乱 ...
- .net乱码问题
最近在给一个客户做framwwork版本升级,从1.0版本升级到4.0版本,发现最大的问题就是乱码. 在1.0版本下,gb2312编码能够运行得很好,可是升级到4.0后就都是乱码. 随后将webcon ...
- MVC3 新建项目
一.安装工具 二.新建项目 step1:新建MVC3项目 打开新建项目窗口,在“已安装的模板”列表中选择“Web”,在右侧应用程序模板列表中选择“ASP.NET MVC3 Web应用程序”,修改项目名 ...
- applicationContext配置文件中的属性说明
lazy-init:设置只对scop属性为singleton的bean起作用. 1.true:延迟加载:这时在第一次向容器通过getBean索取bean时实例化的. 2.false:表示spring启 ...
- Rigid motion segmentation
In computer vision, rigid motion segmentation is the process of separating regions, features, or tra ...
- Apache与nginx优缺点对比
1.nginx相对于Apache优点: nginx轻量级,同样起web服务,比apache占用更少的内存资源: 抗并发,nginx处理请求是异步非阻塞型的,Apache处理请求是阻塞型的,所以在处理高 ...
- JavaEE MyBatis
1. 简介 MyBatis本是apache的一个开源项目iBatis的升级版,2013年11月迁移到Github,是三层架构中持久层框架. 目前提供了Java..NET.以及Ruby三种语言实现的版 ...
- Bootstrap学习应用
1.栅格式布局: 栅格只有12格 主要用于没有设计经验,自行设计网页. 起步: 导入一个CSS文件 和两个JS文件 BOOTATRAP.MIN.CSS --- /*IE(ht ...