iOS 单例模式(singlenton )学习笔记

浑浑噩噩的一周就又要过完了?不存在的^.^

扯淡

1.给这周留下点儿什么,就写点东西,记录一下,我除了吃喝拉撒睡打球听歌唱歌跑步看电影刷微博打农药思考人生(璀璨至尊青铜three,还有sei!!!)以外不是什么都没做哦。
2.网上大把的资料足矣,而这个个人的天地,仅仅记录自己的学习的历程自己的思考自己的想法(至少初衷的是这样子,对,没错)。

书归正传

本文只讨论了ARC 模式下的 单例。

参考资料

  • objc.io 中国期刊
  • xx_cc
  • 令狐不少侠 (这名字我喜欢)

书写格式

.m:

#import "DSHSinglenton.h"

@implementation DSHSinglenton

static DSHSinglenton *_singlenton = nil;
+ (instancetype)shareInstance{
    return [[self alloc]init];
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    if (!_singlenton) {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _singlenton = [super allocWithZone:zone];
        });
    }
    return _singlenton;
}

- (instancetype)copyWithZone:(NSZone *)zone{
    return _singlenton;
}

- (id)mutableCopyWithZone:(NSZone *)zone{
    return _singlenton;
}

@end

然后对创建实例的各种方法做了测试

DSHSinglenton *singlenton_1 =  [DSHSinglenton shareInstance];
singlenton_1.age = 1;
        
DSHSinglenton *singlenton_2 = [singlenton_1 copy];
singlenton_2.age = 2;
        
DSHSinglenton *singlenton_3 = [[DSHSinglenton alloc]init];
singlenton_3.age = 3;
        
DSHSinglenton *singlenton_4 = [DSHSinglenton new];
singlenton_4.age = 4;
        
NSLog(@"%@,age= %ld",singlenton_1,(long)singlenton_1.age);
NSLog(@"%@,age= %ld",singlenton_2,(long)singlenton_2.age);
NSLog(@"%@,age= %ld",singlenton_3,(long)singlenton_3.age);
NSLog(@"%@,age= %ld",singlenton_4,(long)singlenton_4.age);  

结果显示:

结果.png

内存地址都是同一个,不同的创建方式都指向同一个实例对象,没毛病。
这就是一个单例基本的创建方式。

单例优缺点

摘自 xx_cc :

优点:
单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
单例模式因为类控制了实例化过程,所以类可以更加灵活修改实例化过程。
缺点:
单例对象一旦建立,对象指针是保存在静态区的,单例对象在堆中分配的内存空间,会在应用程序终止后才会被释放。
单例类无法继承,因此很难进行类的扩展。
单例不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。
注意:我们在使用单例类之前,一定要考虑好单例类是否适合和类以后的扩展性,避免盲目滥用单例

摘自:objc.io 中国期刊

单例就是披着羊皮的全局状态;

由于对于单例实例来说它没有明确的所有者,(因为单例自己管理自己的生命周期),“关闭”一个单例变得非常的困难。

这里我们得到的教训是,单例应该只用来保存全局的状态,并且不能和任何作用域绑定。如果这些状态的作用域比一个完整的应用程序的生命周期要短,那么这个状态就不应该使用单例来管理。用一个单例来管理用户绑定的状态,是代码的坏味道,你应该认真的重新评估你的对象图的设计

期刊中说:可以采用依赖注入避免单例的滥用。:P 别问我啥是依赖注入,我啥也不知道。。。

学习的脚步 不敢停下

关于单例,还在学习之中,今天学以记之。

你可能感兴趣的:(iOS 单例模式(singlenton )学习笔记)