iOS常用设计模式之单例模式
2015-07-19 18:17
543 查看
单例模式是iOS设计模式中常用的一种设计模式,它的意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式的作用就是为了解决“应用中只有一个实例”这一类问题。
单例模式一般会封装一个静态属性,并提供静态实例的创建方法。下面上代码:
如果使用者能严格按照要求来使用给定的方法,这个单例还是可以的,但是,如果不小心调用了其他可以生成对象的方法,那这个单例就失去了它的作用。所以,这个单例还需要改造:
1、重写allocWithZone方法,保证使用者在调用alloc或者init的时候不会产生新的对象。
2、重写copyWithZone和mutableCopyWithZone方法,保证使用者在进行对象复制的时候不会产生新的对象。
3、看情况重写retain、retainCount、release和autorelease方法。(ARC模式下需要注释掉)
重新改造的单例如下:
测试代码和输入输出结果:
输出:
附上这个类的下载地址:单例
单例模式一般会封装一个静态属性,并提供静态实例的创建方法。下面上代码:
// // Singleton.h // DesignPatternsDemo // // Created by 韩学鹏 on 15/6/19. // Copyright (c) 2015年 韩学鹏. All rights reserved. // #import @interface Singleton : NSObject + (Singleton *)shareManager; @end
// // Singleton.m // DesignPatternsDemo // // Created by 韩学鹏 on 15/6/19. // Copyright (c) 2015年 韩学鹏. All rights reserved. // #import "Singleton.h" @implementation Singleton static Singleton *_shareManager = nil; + (Singleton *)shareManager { static dispatch_once_t once; dispatch_once(&once, ^{ _shareManager = [[self alloc] init]; }); return _shareManager; } @end
如果使用者能严格按照要求来使用给定的方法,这个单例还是可以的,但是,如果不小心调用了其他可以生成对象的方法,那这个单例就失去了它的作用。所以,这个单例还需要改造:
1、重写allocWithZone方法,保证使用者在调用alloc或者init的时候不会产生新的对象。
2、重写copyWithZone和mutableCopyWithZone方法,保证使用者在进行对象复制的时候不会产生新的对象。
3、看情况重写retain、retainCount、release和autorelease方法。(ARC模式下需要注释掉)
重新改造的单例如下:
// // Singleton.m // DesignPatternsDemo // // Created by 韩学鹏 on 15/6/19. // Copyright (c) 2015年 韩学鹏. All rights reserved. // #import "Singleton.h" @implementation Singleton static Singleton *_shareManager = nil; + (Singleton *)shareManager { static dispatch_once_t once; dispatch_once(&once, ^{ _shareManager = [[self alloc] init]; }); return _shareManager; } + (id)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t once; dispatch_once(&once, ^{ _shareManager = [super allocWithZone:zone]; }); return _shareManager; } - (id)copyWithZone:(NSZone *)zone { return _shareManager; } - (id)mutableCopyWithZone:(NSZone *)zone { return [self copyWithZone:zone]; } /* ARC无效时 - (id)retain { return _shareManager; } - (NSUInteger)retainCount { return 1; } - (oneway void)release { } - (id)autorelease { return _shareManager; } */ @end
测试代码和输入输出结果:
id obj = [Singleton new]; id obj1 = [Singleton shareManager]; id obj2 = [[Singleton alloc] init]; NSLog(@"obj:%@", obj); NSLog(@"obj1:%@", obj1); NSLog(@"obj2:%@", obj2);
输出:
2015-06-19 19:15:27.452 DesignPatternsDemo[24125:607] obj:2015-06-19 19:15:27.453 DesignPatternsDemo[24125:607] obj1:2015-06-19 19:15:27.453 DesignPatternsDemo[24125:607] obj2:
附上这个类的下载地址:单例
相关文章推荐
- IOS TableView滑动不灵敏问题
- IOS数组的排序和筛选
- IOS取消performSelector警告
- IOS艺术字及简单的图文混排
- IOS计算文字高度
- IOS之——快速获取苹果设备UDID(插曲)
- ios文章list
- ios文章list
- 28-手势 响应者链 手势识别器
- iOS设计模式-桥接
- iOS应用程序生命周期(前后台切换,应用的各种状态)详解 .
- ios 线程同步
- IOS SEL (@selector) 原理及使用总结(二)
- IOS SEL (@selector) 原理及使用总结(一)
- IOS 解决CG截图功能出现图片翻转的情况
- iOS之新建工程上下出现黑色块
- (七十五)CoreLocation(一)在iOS7和iOS8设备上获取授权
- (七十五)CoreLocation(一)在iOS7和iOS8设备上获取授权
- 苹果开发者证书生成流程
- Nagios监控平台搭建