谈起设计模式,大家在兴奋之余难免心生畏惧。兴奋的原因是我们能够灵活而有机地运用设计模式,这就意味着编程工作的高效性和产品健壮性、安全性的提高。很多人自豪于能够透彻掌握“某某设计模式”,而面试官们也常常把对“某某设计模式”的掌握程度作为考评求职者的重要标准之一。设计模式的重要性和技巧性可想而知。那么,畏惧从何说起呢?设计模式是个很庞杂的知识体系,即便是同一设计模式在不同开发语言环境下也存在很大的差异,而真正能驾驭设计模式的开发者的确不多。
那么,什么是设计模式呢?设计模式是在特定场景下对特定问题的解决方案,这些解决方案是经过反复论证和测试总结出来的。实际上,除了软件设计,设计模式也被广泛应用于其他领域,比如UI设计和建筑设计等。
软件设计模式大都来源于GoF的23种设计模式。该书的设计模式都是面向对象的,在C++、Java和C#领域都有广泛的应用。Cocoa和Cocoa Touch框架中的设计模式也基本上是这23种设计模式的演变,但是具体来说,Cocoa和Cocoa Touch中的设计模式仍然存在着差异。
关于iOS开发,我们将重点分析Cocoa框架下的几个设计模式。当然,Cocoa框架下关于设计模式的内容远不止这些,但为了能在尽量短的时间内让其为我所用,我们经过审慎地思考并结合多年的开发经验,选择了如下4种设计模式:单例模式、委托模式、观察者模式和MVC模式.今天南昌购物商城开发公司--百恒网络和大家一起先来了解一下单例模式。
单例模式
单例模式的作用是解决“应用中只有一个实例”的一类问题。
1.1 问题提出
在一个iOS应用的生命周期中,有时候我们只需要某个类的一个实例。例如,当应用程序启动时,应用的状态由 UIApplication 类的一个实例维护,这个实例代表了整个“应用程序对象”,它只能是一个实例,其作用是实现应用程序中一些共享资源的访问和状态的保持等。
1.2 Objective-C 实现原理
单例模式一般会封装一个静态属性,并提供静态实例的创建方法,其UML类图如图所示。
Objective-C实现单例设计模式类图
实现的参考代码如下:
其中 static Singleton *sharedManager 为静态变量,类方为 + (Singleton*)sharedManager 。 sharedManager 方法采用了GCD(Grand Central Dispatch)技术,这是一种基于C语言的多线程访问技术。在上述代码中, dispatch_once函数就是由GCD提供的,它的作用是在整个应用程序生命周期中只执行一次代码块( ^{…} )。 dispatch_once_t 是GCD提供的结构体,使用时需要将GCD地址传给 dispatch_once 函数。 dispatch_once 函数能够记录该代码块是否被调用过。
dispatch_once 函数不仅意味着代码仅会被运行一次,而且还意味着此运行还是线程同步的。也就是说,当我们使用dispatch_once 函数时,就不再需要使用诸如 @synchronized 之类的语句。
1.3 Swift 实现原理
使用Swift语言实现单例设计模式的类图如图所示。
使用Swift语言实现单例设计模式的类图
使用Swift语言实现的单例设计模式非常灵活,可以通过计算性替代操作(方法),还可以将属性定义为静态属性。Swift单例设计模式实现的方式有很多,下面是考虑线程安全的单例模式,相关代码如下:
上述代码第①行中的 sharedInstance 是静态计算属性,通过该属性可以获得单例对象。第②行代码用于定义
结构体,其中有两个属性—— instance 和 token ,其中第③行代码用于定义静态属性 instance ,它用来保存 Singleton的子单例对象。第④行代码定义了静态属性 token ,它是dispatch_once_t 类型。第⑤行代码用于将 token 地址传给dispatch_once 函数。 dispatch_once 函数能够记录该代码是否被调用dispatch_once 函数不仅意味着代码仅会被运行一次,而且还意味着此运行是线程同步的。
第⑥行代码用于实例化 Singleton 对象,第⑦行代码用于返回实例。
1.4 应用案例
在Cocoa Touch框架中,有 UIApplication 、 NSUserDefaults 和 NSNotificationCenter 等单例类。另外, NSFileManager
和 NSBundle 类虽然属于Cocoa框架的内容,但也可以在Cocoa Touch框架中使用(Cocoa框架中的单例类有NSFileManager 、 NSWorkspace 和 NSApplication 等)。
1. UIApplication
UIApplication 类的实例提供了应用程序的集中控制点来保持应用的状态。 UIApplication 实例总是分配给应用程序委托对象( UIApplicationDelegate ),通过应用程序委托对象来响应低内存、应用启动、后台运行和应用终止等事件。在HelloWorld案例中, AppDelegate 就是这个应用程序的委托对象,它实现了UIApplicationDelegate 协议。
UIApplication 类有很多方法和属性,下面我们重点介绍其中几个。
+ sharedApplication 方法。创建和获得 UIApplication 实例的静态方法。
idleTimerDisabled 属性。设定和获得“空闲时间禁止”的状态。该属性的默认值是 false ,即默认情况下系统会锁定屏幕。当该属性为 true 时,则不会开启“空闲时间禁止”状态,系统不会锁定屏幕。开启这项设定需要谨慎,它会使你的应用比较耗电。
- openURL :方法。可以打开一些内置的iOS应用,其中包括打开浏览器、打开Google地图、拨打电话、发送短信和发送E-mail等。
打开浏览器的示例代码如下:
打开Google地图时,实际上是通过内置浏览器来打开的,示例代码如下:
其中NSString 的stringByAddingPercentEscapesUsingEncoding : 方 法 将 字 符 串 转 换 为 URL 编 码。
如“%E6%B8%85%E5%8D%8E%E5%A4%A7%E5%AD%A6”是“清华大学”的 URL编码。
拨打电话时,苹果官方要求使用该方法调用内置拨号程序,示例代码如下:
发送短信时,苹果官方要求使用该方法调用内置发送短信程序,示例代码如下:
发送E-mail时,这种方式可以发送简单的不带附件的E-mail,示例代码如下:
2. NSUserDefaults
单例类 NSUserDefaults 可以很方便地读取应用设置项目。 + standardUserDefaults 方法是创建和获得NSUserDefaults 实例的静态方法。
3. NSNotificationCenter
单例类 NSNotificationCenter 提供信息广播通知,它采用观察者模式的通知机制。 + defaultCenter 方法是创建和获得 NSNotificationCenter 实例的共享方法。
4. NSFileManager
NSFileManager 提供了访问文件系统的通用操作,可以定位、创建、复制文件和文件夹。在iOS 5和Mac OS Xv10.7之后,它还可以管理存储在iCloud上的数据。 + defaultManager 方法是创建和获得 NSFileManager 实例的方法。
5. NSBundle
NSBundle 提供了动态加载(或卸载)可执行代码、定位资源文件、资源本地化和访问文件系统等功能+mainBundle 方法是创建和获得 NSBundle 实例的共享方法。
本文仅限内部技术人员学习交流,不得作于其他商业用途.希望此文对广大技人员有所帮助。文章出自:南昌购物商城开发公司-百恒网络