1.什么是单例模式
单例模式(Singleton Pattern)是 iOS 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
注意:
- 1、单例类只能有一个实例。
- 2、单例类必须自己创建自己的唯一实例。
- 3、单例类必须给所有其他对象提供这一实例。
2.如何定义一个单例类
单例类既然是一个全局的类,那么我们就要考虑到他的多种初始化方式。
1.[NSObject alloc]init];
2.[NSObject Copy];
3.[NSObject mutableCopy];
4.封装的单例方法 shareInstance;
首先我们来单纯的实现一个单例
+(id)shareInstance{
static Dog *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[super allocWithZone: NULL]init];
});
return instance;
}
自定义类是一定要实现copyWithZone和mutableCopyWithZone的重写,因为通过copy和mutableCopy创建对象的方式太常见了。而且不重写的话,直接调用copy或者mutableCopy也会报错的,会找不到这个方法的。
-(id)copyWithZone:(struct _NSZone *)zone{
return self;
}
-(id)mutableCopyWithZone:(struct _NSZone *)zone{
return self;
}
我们没有实现alloc的重写,我们来看下copy,mutableCopy和shareInstance的地址是否一样就能分辨出他们是不是同一个对象。
0x6000007f82a0------0x6000007f82a0------0x6000007f8320------0x6000007f82a0
四个地址分别为:shareInstace,copy,alloc,mutableCopy。
很明显,通过alloc创建的对象跟其他三种方法创建的不一样。那我们重写一下allocWithZone。
+(id)allocWithZone:(struct _NSZone *)zone{
return [self shareInstance];
}
再次打印,我们看下效果。
0x60000345c360------0x60000345c360------0x60000345c360------0x60000345c360
很明显,通过四种方式创建的都是同一个对象。所以如果要完整的创建一个iOS单例对象,需要注意三点:
1.重写allocWithZone,保证alloc的对象跟shareInstace的一致
2.重写copyWithZone,保证alloc的对象跟shareInstace的一致
3.重写mutableCopyWithZone,保证alloc的对象跟shareInstace的一致