美文网首页
第六节:单例

第六节:单例

作者: 清杨程 | 来源:发表于2018-09-17 15:41 被阅读6次

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

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

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

    相关文章

      网友评论

          本文标题:第六节:单例

          本文链接:https://www.haomeiwen.com/subject/yizlnftx.html