一、单例的定义
在程序的整个运行过程中,只创建一个对象实例,内存地址一直不变,就叫做单例。
单例模式图示
二、iOS中的单例
cocoa框架中常用的是:
- UIApplication
- NSNotificationCenter
- NSFileManager
- NSUserDefaults
- NSURLCache
三、单例模式的优缺点
优点:
1.减少内存开支(对象需要频繁的创建和销毁)
2.减少系统的性能开销
3.避免对同一资源的同时读写操作,优化和共享资源访问
缺点:
1.没有抽象层,扩展困难,想要扩展就必须要修改代码
2.职责太重,违背了“单一职责原则”
3.在多线程中使用单例,需要多该单例成员进行线程互斥处理
四、自定义一个单例类
.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/// 自定义一个单例类
@interface GQSingletonTool : NSObject
/// 初始化方法
+ (instancetype)shareInstance;
@end
.m
一般的写法(不完美,但是够用):
#import "GQSingletonTool.h"
@implementation GQSingletonTool
+ (instancetype)shareInstance {
static GQSingletonTool *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[GQSingletonTool alloc] init];
});
return instance;
}
@end
上面写法的缺陷,在于如果不使用规定的 shareInstance 方法来初始化,而是采用 alloc init 的话,就没法保证生成的是单例的对象了。
完备的写法:
#import "GQSingletonTool.h"
@implementation GQSingletonTool
// 初始化(单例方法)
+ (instancetype)shareInstance {
static GQSingletonTool *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[GQSingletonTool alloc] init];
});
return instance;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
return [GQSingletonTool shareInstance];
}
+ (instancetype)alloc {
return [GQSingletonTool shareInstance];
}
- (id)copy {
return self;
}
- (id)mutableCopy {
return self;
}
+ (id)copyWithZone:(struct _NSZone *)zone {
return self;
}
@end
网友评论