11.单例设计模式
2015-08-01 17:42
246 查看
1.单例的基本概念
单例设计模式运用较为普遍,广泛且较为简单的设计模式之一,它的设计原理是始终返回一个实例,即一个类始终只有一个实例.创建单例设计模式的基本步骤:
1) 声明一个单例对象的静态实例,并初始化为nil;
2) 创建一个类的类工厂方法,生成一个该类的实例,当且仅当这个类的实例为nil时
3) 覆盖allocWithZone:方法,确保用户(程序员)在直接分配和初始化对象是,不会产生另一个对象.
4) 实现NSCopying协议,覆盖release,autorelease,retain,retainCount方法,以此确保单例的状态.
5) 在多线程环境中,注意使用@synchronized(同步锁)关键字,确保静态实例被正确的创建和初始化;
2.UserContext.h和UserContext.m文件
#import <Foundation/Foundation.h> @interface UserContext : NSObject<NSCopying> @property(nonatomic,copy)NSString *userName; @property(nonatomic,copy)NSString *email; + (id)shareUserContext; @end
#import "UserContext.h" static UserContext *segtonInstance = nil; @implementation UserContext + (id)shareUserContext { @synchronized(self){ if (segtonInstance == nil) { segtonInstance = [[[self class] alloc] init]; } } return segtonInstance; } #pragma mark - 下面的方法为了确保只有一个实例对象 + (id)allocWithZone:(NSZone *)zone { if (segtonInstance == nil) { segtonInstance = [super allocWithZone:zone]; } return segtonInstance; } - (id)copyWithZone:(NSZone *)zone { return segtonInstance; } - (id)retain { return segtonInstance; } - (oneway void)release { } - (id)autorelease { return segtonInstance; } - (NSUInteger)retainCount { return UINT_MAX; } @end
3.main.m文件
UserContext *userContext = [UserContext shareUserContext]; UserContext *userContext2 = [UserContext shareUserContext]; UserContext *userContext3 = [[UserContext alloc] init]; UserContext *userContext4 = [userContext copy]; //上面几个对象指向同一个地址 [userContext release]; [userContext release]; [userContext release]; [userContext release]; NSLog(@"%p",userContext);//--->0x100109ec0 NSLog(@"%p",userContext2);//--->0x100109ec0 NSLog(@"%p",userContext3);//--->0x100109ec0 NSLog(@"%p",userContext4);//--->0x100109ec0
4.课堂内容单例
Singleton.h和Singleton.m文件#import <Foundation/Foundation.h> @interface Singleton : NSObject @property(nonatomic,copy)NSString *userName; + (Singleton *)shareSingleton; @end
#import "Singleton.h" @implementation Singleton + (Singleton *)shareSingleton{ //定义一个静态实例 static Singleton *single; if (single == nil) {//不安全 single = [[Singleton alloc] init]; } //关键字@synchronized同步锁,表示同一时间只能有一个线程访问 @synchronized(self){ if(single == nil){ single = [[Singleton alloc] init]; } } static dispatch_once_t oneToken; //能保证当前这个对象只能被创建一次 dispatch_once(&oneToken, ^{ single = [[Singleton alloc] init]; }); return single; } @end
ViewController.m文件的viewDidLoad方法里面
- (void)viewDidLoad { //使用前面创建的单例对象 [Singleton shareSingleton].userName = @"zhangsan"; NSLog(@"%@",[Singleton shareSingleton].userName); // 1.[UIScreen mainScreen] 2.[NSFileManager defaultManager] 3.[NSUserDefaults standardUserDefaults] 4.[NSBundle mainBundle] //系统为了保证某些对象在工程里唯一,使用单例创建对象,如上四个.单例方法一般都是+号方法,放回当前类型的对象,方法一般以些关键词开头:share,main,default然后加上类名就是一个单例 }
相关文章推荐
- Scala 深入浅出实战经典 第46讲: ClassTag 、Manifest、ClasMainifest TagType实战
- Error configuring application listener of class org.springframework.web.context.ContextLoaderListene
- 杭电1795-The last one
- 关于怕重构耗内存的误解(实际情况是:(传对象参==传索引))
- Twitter Storm: DRPC简介 .
- cocos3——11.事件分发
- php-高级(Cookie 和 Sessions)
- Failed to read candidate component class
- 动态更新highcharts数据
- HDU 3172 Virtual Friends (并查集节点统计)
- JAVA入门基础文章1-类的概念
- localhost:8080页面打不开
- c# 调用c DLL 所传参数不正确
- 印制电路板设计
- Android的图片上传
- poj 2886
- I2C总线信号时序总结
- 周练个人赛(hdoj 1795)(求素数问题)
- 无向图的点双连通分量(tarjan模板)
- EJB学习(五)——依赖注入