iOS 单例模式
“单例模式”是我在iOS中最常使用的设计模式之一。单例模式不需要传递任何参数,就有效地解决了不同代码间的数据共享问题。单例类是一个非常重要的概念,因为它们表现出了一种十分有用的设计模式。单例类的应用贯穿于整个iOS的SDK中。例如,UIApplication类有一个方法叫sharedApplication,从任何地方调用这个方法,都将返回与当前正在运行的应用程序相关联的UIApplication实例。除了这个,NSNotificationCenter(消息中心) 、NSFileManager(文件管理) 、 NSUserDefaults(应用程序设置) 、NSURLCache(请求缓存)、NSHTTPCookieStorage(应用程序cookies池)都是系统单例;单例类保证了应用程序的生命周期中有且仅有一个该类的实例对象,而且易于外界访问。
单例模式的要点:
一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
单例模式的优点:
1.实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例。
2.灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程
IOS中的单例模式:
在objective-c中要实现一个单例类,至少需要做以下四个步骤:
1、为单例对象实现一个静态实例,并初始化,然后设置成nil,
2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,
4、适当实现copyWithZone,release和autorelease。
1、为单例对象实现一个静态实例,并初始化,然后设置成nil,
2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,
4、适当实现copyWithZone,release和autorelease。
单例模式的实现:
代码示例:
MySingletonClass.h
#import <Foundation/Foundation.h> @interface MySingletonClass : NSObject //单例方法
+(MySingletonClass *)sharedInstance; @end
MySingletonClass.m
#import "MySingletonClass.h" @implementation MySingletonClass //1、为单例对象实现一个静态实例,并初始化,然后设置成nil, static MySingletonClass *manager = nil; //2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例, +(MySingletonClass *)sharedInstance{ @synchronized(self) { if(manager == nil) { manager = [[MySingletonClass alloc] init]; // assignment not done here } } return manager; } //3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例, +(id)allocWithZone:(NSZone *)zone{ @synchronized(self){ if (!manager) { manager = [super allocWithZone:zone]; //确保使用同一块内存地址 return manager; } return nil; } } //4、适当实现copyWithZone,release和autorelease。 - (id)init; { @synchronized(self) { if (self = [super init]){ return self; } return nil; } } //确保copy对象也是唯一 - (id)copyWithZone:(NSZone *)zone;{ return self; }
本文示例源码下载:http://www.oschina.net/code/snippet_2337537_52413
参考链接:
http://www.cnblogs.com/lyanet/archive/2013/01/11/2856468.html
http://blog.sina.com.cn/s/blog_71715bf80101a8mm.html