单例概述
iOS系统,有不少的应用级的对象都是以单例模式创建的。比如UIApplication等。
单例模式 就是在整个应用或者系统中只能创建一个唯一的实例,这个实例对象只初始化一次。
单例优缺点
单例模式的优点:
内存占用更小,易于跨模块应用 ,可以灵活修改实例化过程。
单例模式的缺点:
1.时间耗时会多,因为每次获取前都要先判断是否已经存在了实例。特别是多线程中,在线程安全的情况下还有可能造成资源等待问题。
2.单例模式不一定都是线程安全的。不同的线程在线程不安全的情况下都访问一个单例对象会引起并发问题。
如何实现单例模式
可以把要实现单例模式的对象实例创建成一个静态变量或者全局变量,在对单例模式类进行实例化的时候先判断一下这个实例对象是否存在,如果存在就直接返回,如果不存在就去创建。
当然单例模式只是一个思想,至于单例的获取入口都有哪些,严格程度如何,可以由开发人员根据需求进行合理安排。
比如 如果想在对象拷贝时候使用,那就在NSCopying,NSMutableCopying协议中实现,实现单例思想。
如果想更多实例化入口中使用单例就可以重写allocWithZone方法。(不建议)
SingletonUtil.h
//
// SingletonUtil.h
// SingletonModel
//
// Created by liuyinghui on 2018/3/2.
// Copyright © 2018年 liuyinghui. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface SingletonUtil : NSObject
+(instancetype)shareSingletonUtil;
@end
SingletonUtil.m
//
// SingletonUtil.m
// SingletonModel
//
// Created by liuyinghui on 2018/3/2.
// Copyright © 2018年 liuyinghui. All rights reserved.
//
#import "SingletonUtil.h"
static SingletonUtil * singletonUtil=nil;
@interface SingletonUtil()<NSCopying,NSMutableCopying>
@end
@implementation SingletonUtil
+(instancetype)shareSingletonUtil{
@synchronized (self)
{
if (singletonUtil==nil) {
singletonUtil = [[self alloc] init];
}
}
return singletonUtil;
}
- (id)copyWithZone:(nullable NSZone *)zone{
return self;
}
- (id)mutableCopyWithZone:(nullable NSZone *)zone{
return self;
}
+ (id) allocWithZone:(NSZone *)zone
{
@synchronized (self) {
if (singletonUtil == nil) {
NSLog(@"构造");
singletonUtil = [super allocWithZone:zone];
return singletonUtil;
}
else return singletonUtil;
}
return nil;
}
@end
SingletonUtil *util0=[[SingletonUtil alloc] init];
SingletonUtil *util1=[SingletonUtil shareSingletonUtil];
SingletonUtil *util2=[util1 copy];
SingletonUtil *util3=[util2 mutableCopy];
SingletonUtil *util4=[SingletonUtil new];
源码链接