close
当前位置: 物联网在线 > 技术文库 > ios >

iOS常用设计模式

1.为什么学习设计模式

对于设计模式,我们并不陌生。一谈起设计模式,脑海里马上就想到单例模式,委托模式,观察者模式等等。而面试官们也通常把对“某某设计模式”的掌握程度作为考评求职者的重要指标之一。那么问题来了,为什么要学习设计模式呢?没有设计模式我们同样能够实现功能,为什么还要“多此一举”呢?原因很简单,所谓的设计模式,只是为了开发者更好地去理解程序,说白了代码是死的,它们本身没有什么设计模式可言,只是开发者为了更好地理解程序,总结了一些设计模式,为的是让代码看上去更有条理,也便于人们理解。

2.介绍几种比较常用的设计模式 单例模式 单例模式的应用场景

单例模式的作用是解决应用程序中只有一个实例的问题,这在我们设计中会经常遇到,比如应用程序启动时,应用状态由UIApplication类一个实例维护,还有NSUserDefaults和NSNotificationCenter等单例。

单例模式的具体实现

oc版

+(Singleton *)sharedInstance{ static Singleton *sharedSingleton = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedSingleton = [[Singleton alloc] init]; }); return sharedSingleton; }

swift版

private let sharedInstance = Singleton() class Singleton: NSObject { class var sharedManager: Singleton { return sharedInstance; } } 委托模式 委托设计模式类图

iOS常用设计模式

委托设计模式类图

委托模式的应用场景

在iOS开发中,用到的系统的UITextField或者UITableView等都是应用的委托模式设计的,我们自己在开发过程中也会经常遇到,比如一些保存个人信息的界面,将信息填写完成之后,便可采用委托的方式将信息回传到首界面展示个人信息。还有很多类子,在这里就不一一列举了。

委托模式的具体实现

这里举一个简单的类子,比如我一天只干三件事,吃饭,睡觉,工作,为了更好地工作和生活,我请了一个助理。要成为我的助理,需要实现一个协议,协议要求能够处理吃饭,睡觉,工作问题。通用类就是我(coderPeng类),通过代理(delegate)属性保持委托对象的引用.委托对象(ViewController)就是我的助理,它实现了了协议coderPengDelegate.coderPengDelegate定义了三个方法:sleep,eat,work方法.

oc版

CoderPeng类中的代码 .h中的代码 @protocol CoderPengDelegate <NSObject> @required - (void)sleep; - (void)eat; - (void)work; @end @interface CoderPeng : NSObject //weak修饰为了防止内存的"强引用循环",从而避免内存泄漏问题 @property (nonatomic,weak)id<CoderPengDelegate>delegate; - (void)start; @end .m中的代码 -(void)start{ if (self.delegate && [self.delegate respondsToSelector:@selector(sleep)] && [self.delegate respondsToSelector:@selector(eat)] && [self.delegate respondsToSelector:@selector(work)]) { [self.delegate sleep]; [self.delegate work]; [self.delegate eat]; } } ViewControler类中的代码 @interface ViewController ()<CoderPengDelegate> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. CoderPeng *coderPeng = [[CoderPeng alloc] init]; coderPeng.delegate = self; [coderPeng start]; } #pragma mark 协议方法 -(void)sleep{ NSLog(@"睡觉"); } - (void)eat{ NSLog(@"吃饭"); } - (void)work{ NSLog(@"工作"); } @end

swift版

CoderPeng类中的代码 protocol coderPengDelegate { func sleep() func eat() func work() } class CoderPeng: NSObject { var delegate:coderPengDelegate? func start() { self.delegate?.sleep() self.delegate?.eat() self.delegate?.work() } } ViewController类中的代码 class ViewController: UIViewController,coderPengDelegate { override func viewDidLoad() { super.viewDidLoad() let coderPeng = CoderPeng() coderPeng.delegate = self coderPeng.start() } //MARK:协议方法 func sleep() { print("睡觉") } func eat() { print("吃饭") } func work() { print("工作") } } 观察者模式 观察者模式简述

观察者模式也叫发布/订阅模式,是MVC模式的重要组成部分,它有4个角色,具体如下:

1. 抽象主题(Subject): 在swift中,抽象主题是一个协议,它是一个观察者集合容器,定义了添加观察者方法,移除观察者方法和为所有观察者发送通知的方法;

2. 抽象观察者(Observer): 在swift中,抽象观察者也是一个协议,它有一个更新方法;

3. 具体观察者(ConcreteObserver): Observer协议的具体实现;

4. 具体主题(ConcreteSubject): Subject协议的具体实现.

引入Subject和Observer这俩个协议之后,不仅提高了系统的可复用性,还降低了耦合度。

通知机制和KVO机制

在Cocoa Touch框架中,观察者模式的具体应用有俩个——通知机制和KVO机制,下面介绍这俩个机制:

通知机制


(责任编辑:ioter)

用户喜欢...

用Python做数据分析:Pandas常用数据查询语法

作者:大毛 在使用Pandas之前,大多数数据分析师已经掌握了Excel和SQL,并且在刚上手Pandas时会经常习惯性想到“老办...


单片机I/O的常用驱动与隔离电路的设计

随着微电子技术和计算机技术的发展,原来以强电和电器为主、功能简单的电气设备发展成为强、弱电结合,具有数字化特点、功能完善的新型微电子设备。 在很多场合,已经出现了越来越...


如何测量LED光通量和辐射功率?常用方法介绍及测量建议

通常,光通量和辐射功率是LED最重要的光学参数,但是有时也会提到光强空间分布。对于较小的器件,平均LED的强度...


Python编程中常用的12种基础知识

Python 编程中常用的12 种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序、去重,字典排序,字典、列表、字符串互转,时间对象操作,命令行参数解析(getopt),print 格式化输出...


Python超过R,成为数据科学和机器学习的最常用语言

作者:陈桦 近期,数据挖掘资讯网站KDnuggets开展了一项调查,问题是“2016年和2017年,在数据分析、数据科学和机器...


Python常用库大全

环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具。 pyenv – 简单的 Python 版本管理工具。 Vex – 可以在虚拟环境中执行命令。 virtualenv – 创建独立 Python 环境...


液压系统常用的液压马达应该怎么选型呢?

液压马达是液压系统的一个执行机构,是驱动设备部件旋转的一种液压装置,是负责执行人体系统命令的执行元件。...


单片机代码写入的三种常用语句

工作中经过摸索实验,总结出单片机大致应用程序的架构有三种: 1. 简单的前后台顺序执行程序,这类写法是大多数人使用的方法,不需用思考程序的具体架构,直接通过执行顺序编写应用...


智能家居常用7大解决方案

智能家居是在互联网影响之下物联化的体现。智能家居通过物联网技术将家中的各种设备音视频设备、照明系统、窗...


OpenGL常用命令备忘录(Part B)

像glPixelStorei(GL_PACK_ALIGNMENT, 1)这样的调用,通常会用于像素传输(PACK/UNPACK)的场合。尤其是导入纹理(glTexImage2D)的时候: C++代码 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(,,,, pixelData); glPixelStorei...