1.单例模式的作用
1>可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问 (这个苹果系统给我们提供很多单例的形式: 如share开头的类方法, default开头的类方法等等)
// 文件管理
NSFileManager *manager = [NSFileManager defaultManager];
NSFileManager *manager2 = [NSFileManager defaultManager];
NSFileManager *manager3 = [NSFileManager defaultManager];
NSFileManager *manager4 = [NSFileManager defaultManager];
NSLog(@"\n%@\n%@\n%@\n%@",manager,manager2,manager3,manager4);
// 程序管理
[UIApplication sharedApplication];
// 设置(偏好设置)
[NSUserDefaults standardUserDefaults];
控制台输出:
Snip20150927_1.png
2> 方便的控制实例个数, 并且节约系统资源
2.单例模式的使用场合
1>资源只需要初始化一次,在程序中,共享一份资源
单例模式的创建过程
1.在ARC中,在.m文件中,保留一个全局的static的实例
static id _instance;
2.重写+ allocWithZone:
此方法在调用alloc时必会调用. 对于alloc
方法,相信大家并不是很陌生, alloc方法,的主要作用就是为了给新创建的对象分配存储空间用的.
所以在这里创建唯一的实例(不过要注意线程安全)[前一段学习了 一次性代码, 将代码块放在一次性代码内部,便可以只执行一次,也就是只分配了一次性内存]
- 有人会说,懒加载也可以,但是懒加载会造成资源抢夺的问题,为了解决这个问题,可以添加互斥锁,用来解决.
// 重写allocWithZone方法,
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
// 执行一次性代码
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (_instance == nil) {
NSLog(@"我爱你");
_instance = [super allocWithZone:zone];
}
});
// 创建实例
return _instance;
}
- 提供1个类方法让外界访问唯一的实例
+ shareInstance
[方法名必须有意义,见名知意]
// 自定义单例方法
+ (instancetype)shareInstance
{
return [[self alloc]init];
}
- 对于单例,应该无论以何种方式创建都应该只有一份内存的, 对于ARC的创建的方法还有
copy``mutableCopy
,但必须遵守协议<NSCopying,NSMutableCopying> , 执行copy,MutableCopy的时候必定会执行copyWithZone``mutableCopyWithZone
- (id)copyWithZone:(struct _NSZone *)zone
{
return _instance;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
return _instance;
}
MRC创建单例,和ARC基本相同, 只不过ARC是自动引用计数器, 会自动释放.MRC必须手动释放内存
1.多了一个new的类方法创建方法:
// 创建方法:new
+ (instancetype)new
{
return [[self alloc]init];
}
2.多了一个retain的对象方法创建方法:
- (instancetype)retain
{
return _instance;
}
- 分配一份内存,永远不要被release
- (oneway void)release
{
}
- 专业一点,让其返回最大计数,让人一看就知道是单例
- (NSUInteger)retainCount
{
return MAXFLOAT;
}
5.对象销毁的时候,必须调用dealloc
- (void)dealloc
{
[super dealloc];
NSLog(@"被销毁了");
}
网友评论