您的位置:首页 > 移动开发 > IOS开发

iOS设计模式(1):单例模式

2014-01-05 22:45 218 查看
单例模式简单又经常被面试提到,所以放在第一位置。

什么是单例模式?

单例,字面意思就是整个应用只能创建或存在一个实例。

为什么需要单例模式?

1,整个应用程序只能有一个实例。例如:UIApplication类:当应用程序启动时,应用的状态由UIApplication类的一个实例维护,这个实例代表了整个“应用程序对象”,实现应用程序中的一些共享资源的访问和状态的保持等。

2,在iOS应用整个生命周期中,只需要一个实例。例如:UIAccelerometer类:实时获得重力加速计数据,保持x,y,z轴的状态。这个实例只需要一个实例,多个实例完全没有意义(一台设备还能产生2个加速度?),只会占用内存。

...

单例模式的实现原理?

怎么保持只有一个实例呢?

首先我们会想到,1,用个if语句判断类是否已经被实例化。如果未被实例化,则实例化。否则直接返回。2,如果单例对象由多个线程访问呢?所有线程安全至关重要。

单例模式一般会封装一个静态属性,并提供静态实例的创建方法。

下面先用GCD实现:

创建一个Singleton类:

Singleton.h:声明一个静态属性,并提供静态实例的创建方法。

@interface Singleton : NSObject

@property (nonatomic,strong) NSString *singletonData;
+(Singleton *)sharedManager;

@end


Singleton.m

@implementation Singleton
@synthesize singletonData=_singletonData;  //缺省

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

@end


dispatch_once函数:代码只会被运行一次,而且还是线程同步的。所以这里也不需要使用@synchronized。

GCD是基于C语言的多线程访问技术。比较简单又很重要,不熟悉的可以先熟悉下。格式其实也不需要过多记忆,Xcode提供的代码模版也有。

以下是我在公司项目中的一个实现:

static OpenStatistics *sharedInstace = nil;
+ (OpenStatistics *) sharedInstance
{
@synchronized (self)
{
if (sharedInstace == nil)
{
sharedInstace = [[self alloc] init];
//默认设置
sharedInstace.isCrashReportEnabled = YES;
sharedInstace.isLogEnabled = NO;
sharedInstace.policy = BATCH;
sharedInstace.appVersion = XcodeAppVersion;
sharedInstace.channelId = @"App Store";
}
return sharedInstace;
}
}


单例模式在iOS中的应用
1,UIApplication

2,UIAccelerometer

3,NSUserDefaults:读取应用程序设置项目。

4,NSNotificaionCenter:提供信息广播通知。

5,NSFileManager:提供访问文件系统的通用操作,可以定位、创建、复制文件和文件夹。

6,NSBundle:提供动态加载(或卸载)可执行代码、定位资源文件以及资源本地化、访问文件系统等。



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: