iOS学习之单例
来源:互联网 发布:网络预约车管理办法 编辑:程序博客网 时间:2024/06/03 19:08
单例模式的作用:可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于外界访问(说白了就是节省一些内存),其实面试的时候也就是让你手动写下单例,基本固定用GCD,没什么技术含量,平时放在一个类里面或者快捷方式里面就好了
.h文件
#import <Foundation/Foundation.h>@interface SLDemo : NSObject<NSCopying>+ (instancetype)sharedInstance;@end
.m文件
id _testStr = @"testStr";static id _instance; //static修饰一个全局变量,表示该变量只能本文件内部访问,外部无法访问 修改,用来保存唯一的单例对象+ (instancetype)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [super allocWithZone:zone]; //申请内存 });// if (_instance == nil) { //防止频繁加锁// @synchronized(self) {// if (_instance == nil) { //防止多次创建// _instance = [super allocWithZone:zone];// }// }// } return _instance;}+ (instancetype)sharedInstance { NSLog(@"%@",_testStr); static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [[self alloc] init]; //调用allocWithZone });// if (_instance == nil) { //防止频繁加锁// //防止多线程一起进来,加锁// @synchronized(self) {// if (_instance == nil) { //防止多次创建// _instance = [[self alloc] init];// }// }// } return _instance;}- (id)copyWithZone:(NSZone *)zone { return _instance;}@end
调用
- (void)viewDidLoad { [super viewDidLoad]; [self createSLDemo]; }- (void)createSLDemo { //extern关键字是告诉编译器整个工程搜索id _testStr的全局变量,我们就可以更改搜索到后 extern id _testStr; _testStr = @"string"; SLDemo * SL1 = [SLDemo sharedInstance]; SLDemo * SL2 = [SLDemo sharedInstance]; SLDemo * SL3 = [SLDemo sharedInstance]; SLDemo * SL4 = [SLDemo sharedInstance]; NSLog(@"%@ %@ %@ %@",SL1, SL2, SL3, SL4); }@en
会发现打印出的地址是一样的四个,证明只调用了一次,创建了一个共同的实例
解释:上面.m文件用的是static修饰,假如去掉static,就像extern一样,拿出来可以改变,这样单例就很危险了,很可能会被其他人修改,那这样就不叫单例了
上面的单例还可以写在一个文件里,用宏调用,比如:
//.h文件宏#define SLDemoH(name) + (instancetype)shared##name;//.m文件宏#define SLDemoM \id _testStr = @"testStr"; \static id _instance; \ \+ (instancetype)allocWithZone:(struct _NSZone *)zone \{\ static dispatch_once_t onceToken; \ dispatch_once(&onceToken, ^{ \ _instance = [super allocWithZone:zone]; \//申请内存 }); \ // if (_instance == nil) { //防止频繁加锁 // @synchronized(self) { // if (_instance == nil) { //防止多次创建 // _instance = [super allocWithZone:zone]; // } // } // } return _instance;}+ (instancetype)shared##name { NSLog(@"%@",_testStr); static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [[self alloc] init]; //调用allocWithZone }); // if (_instance == nil) { //防止频繁加锁 // //防止多线程一起进来,加锁 // @synchronized(self) { // if (_instance == nil) { //防止多次创建 // _instance = [[self alloc] init]; // } // } // } return _instance;}- (id)copyWithZone:(NSZone *)zone { return _instance;}
再就是可以用条件编译区分ARC 和 MRC
0 0
- iOS学习之单例
- IOS学习之单例的实现
- IOS 之 单例
- iOS学习,dispatch,单例
- iOS单例模式学习
- ios之单例模式
- iOS开发之单例
- IOS之单例模式
- iOS开发之单例
- IOS之单例模式
- iOS之单例模式
- iOS之单例模式
- iOS 开发之 单例
- ios之单例模式
- iOS之单例模式
- GCD之单例iOS
- IOS开发之单例
- ios之单例模式
- [11]PHP_W3Cschool中的PHP测试题题目以及答案
- 责任链模式应用
- vmstat si so单位
- DuiLib : 模拟百度网页的填写和搜索
- Visual Assist X原版及其破解方法
- iOS学习之单例
- ios查找编译过后的生成.app在哪里
- Ugly Number II
- linux 系统变量 $-
- Java File 常用操作回顾
- hdu 4417 Super Mario(查找区间不大于h的数有多少个)(线段树+二分查找,划分树+二分查找)
- C++中随机函数rand()和srand()的用法
- 树状数组
- 有趣的组合问题