单例模式:
/*
设计模式(用来解决编程某些特定问题) --单例模式
单例模式:
什么时候使用单例模式?
在一个工程中,一个类只需要一个实例变量,我们就可以讲这些类设计成单例模式
单例模式的作用:
当一个类A被设计成单例模式时,由类A构造出的实力对象对于其他类来讲为全局实例对象,即在每一个类中有A构造出的实例对象,都没相同的对象
单例模式的实现思路:一个类只能穿件一个实例和一个获得该实例的方法;
*/
其实单例模式就是实现一个类的对象只能在整个工程中存在一个,所以我们要做的就是,防止此类继续创建实例对象,或者 无论怎么创建都是同一个对象
首先要声明一个全局变量:确保全局就它一个实例对象
如下:1.
#import "Student.h"
//为单例模式声明一个静态实力对象,只会在第一次执行一次
static Student *st = nil;
@implementation Student
@end
2.在实现文件中声明一个方法,用来第一次创建实例对象,同时检测是否已经存在本实例对象,如下:
#import <Foundation/Foundation.h>
@interface Student : NSObject
//1.在要被设计成单例模式的类的.H文件中声明一个构造单利的方法
+(Student *)shareInatance;
@end
3,在。m文件里面实现构造单例的模式,如下:
+(Student *)shareInatance{
if (st == nil) {
st = [[Student alloc]init];
}
return st;
}
(如果单单由上面的方法创建出来的对象的话,都是同一对象,但是还可以通过alloc和new来创建新的实例对象的,所以我们还需要通过重写alloc和new创建实例的方法来确保实例对象的单一化)
//为了防止alloc或new创建新的实例变量,重写一下方法
+(instancetype)allocWithZone:(struct _NSZone *)zone{
@synchronized(self) //关于@synchronized(self):它的作用是创建一个互斥锁,保证此时没有其他线程对self对象进行修改,这个是OC中的一个锁令牌,防止self对象在同一时间内被其他线程访问,祈祷线程保护作用,一般在公用公用变量中使用,例如单例模式 或者 操作类的static变量中使用
{
if (st == nil)
{
st = [super allocWithZone:zone];
}
}
return st;
}
(上面已经解决了实现方法,alloc和new创建单一实例变量的单一性,但还有一个方法会产生实例对象,就是copy的实例化对象,所以,一样要从写,如下:)
//为了防止COPY产生新的对象,需要实现NSCopy协议
-(id)copyWithZone:(NSZone *)zone{
return self;
}
好了,单例模式就这么点东西,也可以说就是这么一个模板,只要把这个模板记着就以后都会用了,
总结:
1.创建一个全局变量
2.声明和实现一个创建单一变量的方法,把创建出来的单一对象给予全局变量
3.解决重复创建问题
3.1.重写alloc和new的allocWithZone方法;防止alloc或new新对象
3.2.重写copy的copyWithZone方法:防止copy新对象