常用设计模式之单例

发表于:2015-9-28 10:59

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:CookieJar    来源:51Testing软件测试网采编

  1、单例模式的作用是解决”应用中只有一个实例“的一类问题。
  2、在一个iOS应用的生命周期中,有时候我们只需要某个类的一个实例,如果有多个实例就会占用过多的内存。例如当程序启动时,应用的状态由UIApplication类的一个实例维护,这个实例代表了整个”应用程序对象“,它只能是一个实例,其作用是实现程序中一些共享资源的访问和状态的保护等。
  3、单例模式一般会封装一个静态属性,并提供静态实例的创建方法。代码如下:
1 //
2 //Singleton.h
3 //
4
5 @interface Singleton : NSObject
6
7 + (Singleton*)sharedManager;
8 //属性
9 @property (nonatomic ,strong) NSString* singletonData;
10
11 @end
12
13 -------------------------------------------------------------------------
14
15 //
16 //Singleton.m
17 //
18
19 #import "Singleton.h"
20
21 @implementation Singleton
22  static Singleton *sharedManager = nil;
23 //创建静态实例的方法
24 + (Singleton*)sharedManager
25 {
26     static dispatch_once_t once;
27     dispatch_once(&once, ^{
28         sharedManager = [[self alloc] init];
29     });
30     return sharedManager;
31 }
32 //dispatch_once(dispatch_once_t *predicate, dispatch_block_t block);
33 ??@end
  sharedManager方法我们采用了dispatch_once函数(GCD技术,Grand Central Dispatch,是一种基于C语言的多线程访问技术),它接收一个dispatch_once_t的参数,这个参数GCD提供的结构体,使用时将GCD地址传给dispatch_once函数,这个函数能够记录该代码块是否被调用过。还有一个块参数。对于给定的一个predicate来说,该函数会保证相关的块必定会执行,而且只执行一次,最重要的是这个方法是完全线程安全的,就不需要线程锁@synchronized之类的语句。需要注意的是,对于只需要执行一次的块来说,传入的predicate必须是完全相同的,所以predicate常常会用static或者global来修饰。这样写代码简单清晰,而且做到了线程安全,这样实现的效率也很高。
  4、在Cocoa Touch框架中,有UIApplication、UIaccelerometer、NSUserDefaults和NSNotificationCenter等单例。另外,NSFileManager和NSBundle类虽然属于Cocoa框架的内容,但也可以在Cocoa Touch框架中使用。(Cocoa框架中的单例类有NSFileManager、NSBundle、NSWorkspace和NSApplication等)。
  4.1、UIApplication
  UIApplication类的实例提供了应用程序的集中控制点来保持应用的状态。UIApplication实例总是分配给应用程序委托对象(UIApplicationDelegate),通过应用程序委托对象来响应低内存、应用启动、后台运行和应用终止等时间。下面我们重点介绍这个类的几个方法和属性。
  4.1.1 + sharedApplication方法。创建和获得UIApplication实例的方法。
  4.1.2 idleTimerDisabled属性。设定和获得“空闲时间禁止”的状态。默认值是NO,即默认情况下系统会锁定屏幕。
  4.1.3 - openURL:方法。可以打开一些内置的iOS应用,其中包括打开浏览器、打开地图、拨打电话、发送短信和发送E-mail。
1//打开浏览器
2NSURL*url=[NSURLURLWithString:@"http://www.baidu.com"];
3[[UIApplicationsharedApplication]openURL:url];
4
5//打开Google地图时,实际上是通过内置浏览器打开的。
6NSString*searchQuery=@"中国西安??????";
7//将字符串转换为URL编码
8searchQuery=[searchQuerystringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
9NSString*urlString=[NSStringstringWithFormat:@"http://maps.google.com/maps?q=%@",searchQuery];
10[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:urlString]];
11
12//拨打电话
13[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"tel://123456"]];
14
15//发送短信
16[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"sms:123456"]];
17
18//发送E-mail,不带附件
19[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"mailto://xxxx@xxx.com"]];
  4.2 UIAccelerometer
  它可以访问重力加速计硬件设备,实时获得设备在x轴、y轴和z轴方向上的重力加速度。+sharedAccelerometer方法是创建和获得UIAccelerometer实例的共享方法。
  与Application类似,这个类也有对应的委托对象,其委托对象是UIAccelerometerDelegate。UIAccelerometer犟实例分配给委托对象,然后由委托对象响应重力加速计时间。
  4.3 NSUserDefaults
  单例类NSUserDefaults可以很方便地读取应用设置项目。
  + standardUserDefaults方法是创建和获得NSUserDefaults实例的静态方法。
  4.4 NSNotificationCenter
  单例类NSNotificationCenter提供消息广播通知,它采用观察者模式的通知机制。
  + defaultCenter方法是创建和获得NSNotificationCenter实例的共享方法。
  4.5 NSFileManager
  NSFileManager提供了访问文件系统的通用操作,可以定位、创建、复制文件和文件夹。在iOS5和Mac OS X v10.7之后,它还可以管理存储在iCloud上的数据。
  + defaultManager方法是创建和获得NSFileManager实例的方法。除了该方法外,创建NSFileManager对象还可以使用实例构造方法- init。这两种方法有较大差别,+ defaultManager方法总是返回相同的NSFileManager对象,但如果要使用委托(NSFileManagerDelegate)完成基于文件的操作并接受通知,应该使用- init方法创建一个新的实例,而不是使用共享的对象。
  4.5NSBundle
  NSBundle提供了动态加载(或卸载)可执行代码、定位资源文件以及资源本地化、访问文件系统等功能。
  + mainBundle方法是创建和获得NSBundle实例的共享方法。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号