第六节:单例

单例模式,就是我们定义的⼀个类,这个类只创建⼀次对象,也只创建⼀个对象。这个类的对象,供整个程序使⽤。      

单例模式的三个必要条件:     

1、单例类只能有⼀个对象

2、这个变量必须是⾃⼰⾃⾏创建的。

3、这个变量必须给整个程序使⽤

SingletonTool.h 文件

#import

//遵守NSCopying,NSMutableCopying协议

@interfaceSingletonTool :NSObject

@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);

你可能感兴趣的:(第六节:单例)