单例模式,就是我们定义的⼀个类,这个类只创建⼀次对象,也只创建⼀个对象。这个类的对象,供整个程序使⽤。
单例模式的三个必要条件:
1、单例类只能有⼀个对象
2、这个变量必须是⾃⼰⾃⾏创建的。
3、这个变量必须给整个程序使⽤
SingletonTool.h 文件
#import<Foundation/Foundation.h>
//遵守NSCopying,NSMutableCopying协议
@interfaceSingletonTool :NSObject<NSCopying,NSMutableCopying>
@property(nonatomic,copy)NSString*name;
@property(nonatomic,assign)intage;
@property(nonatomic,assign)BOOLisBoy;
@property(nonatomic,strong)NSArray*inforarry;
//实例化一个类方法、返回一个单例对象
+ (instancetype)shareTools;
@end
SingletonTool.m 文件
#import"SingletonTool.h"
//提供一个static修饰的全局变量、强引用已经实例化的对象
staticSingletonTool*singTool;
@implementationSingletonTool
//实例化一个类方法、返回一个单例对象
+(instancetype)shareTools{
//注意:这里建议使用self,而不是直接使用类名Tools(考虑继承)
return[[selfalloc]init];
}
// 避免alloc产生新对象,所以需要重写allocWithZone方法
+(instancetype)allocWithZone:(struct_NSZone*)zone{
/*
1、使用GCD
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
singTool = [super allocWithZone:zone];
});
*/
//1、使用加锁的方式、保证只分配一次存储空间
@synchronized(self) {
if(singTool==nil) {
singTool= [superallocWithZone:zone];
}
}
returnsingTool;
}
//copy返回一个不可变对象
-(id)copyWithZone:(NSZone*)zone{
//若原对象是不可变对象,那么返回原对象,并将其引用计数加1;
//return [[self class] allocWithZone:zone];
//若原对象是可变对象,那么创建一个新的不可变对象,并初始化为原对象的值,新对象的引用计数为1。
returnsingTool;
}
//mutableCopy创建一个新的可变对象,并初始化为原对象的值,新对象的引用计数为1;
-(id)mutableCopyWithZone:(NSZone*)zone{
returnsingTool;
}
@end
//存入相应属性
SingletonTool*sing = [SingletonToolshareTools];
sing.name=@"Jace";
sing.age=15;
sing.isBoy=YES;
sing.inforarry= [NSArrayarrayWithObjects:@"123",@"abc",@"QWE",nil];
NSLog(@"1-> sing.name= %@, sing.age = %d, sing.isBoy = %d,sing.inforarry = %@", sing.name,sing.age,sing.isBoy, sing.inforarry);
//取出相应值
SingletonTool*sing = [SingletonToolshareTools];
NSLog(@"3-> sing.name= %@, sing.age = %d, sing.isBoy = %d,sing.inforarry = %@", sing.name,sing.age,sing.isBoy, sing.inforarry);
网友评论