• iOS 关于单例常见使用方法


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

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

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

  • 相关阅读:
    String到底能不能改变?
    Java 继承(extends)
    广通远驰亮相2022 C-V2X“四跨”(苏州)应用示范活动
    第二章 ClickHouse架构设计
    slf4j简介说明
    D. Non-zero Segments
    通过实例学习鸿蒙静态库的创建与使用
    【数据库】使用SQLAlchemy建立模型之间的基础关系模式
    【云原生】-MySQL压测神器HammerDB的部署及使用
    头歌:第1关:有序单链表的插入操作
  • 原文地址:https://blog.csdn.net/qq_34491373/article/details/126420418