单例:
--1. 概念:单例模式是确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类,称为单例类。
--2. 使用场景:iOS中几乎所有的APP都只能同时登录一个帐号,而且是电商类的APP中下单是也要带着用户ID,这时候单例就非常重要了。
创建方法
** 1.使用线程锁@synchronized(self) {} 控制某一时间只允许一个进程访问初始化方法 **
static User *instance
+ (instancetype)shareUser
{
@synchronized(self) { //设置同时只有一个线程可以访问shareUser方法
if (!instance) {
instance = [[self alloc] init];
}
}
return instance;
}
--有人提供了一种说是绝对安全的方法。就是将 allocWithZone copyWithZone 等方法都重写
** 2.使用GCD 初始化线程只执行一次 **
+ (instancetype) shareUserGCD
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
测试:
User *xiaoming = [User shareUser];
xiaoming.name = @"xiaoming";//User类有一个一个name属性
User *lily = [User shareUser];
NSLog(@" xiaoming.name = %@",xiaoming.name);
NSLog(@" lily.name = %@,lily.name");
输出结果为:
lily.name = xiaoming```
> 分析:lily.name并没有赋值,但是lily.name = xiaoming,
由此可见 xiaoming 与lily就是一个对象,单例创建成功
--也可以输出一个 xiaoming与lily的内存地址,相等即为单例
```文 借鉴自/ManoBoo(简书作者)```