单例的三种写法,static的理解

(一)在.h文件
#pragma mark 创建单例的方法
//类名(即 +(SharedData *))
//id类型的话,外面使用的时候只知道是对象类型
//instancetype可以动态识别是哪一种对象类型

//开发者通常使用share 系统默认是default(即defaultData),一般还有standard
//起名习惯:share + 类名

+(instancetype)shareData;
@property(nonatomic,copy)NSString *useName;
//+(SharedData *)shareData;
//+(id)shareData;

/*
//------ 单例传值-----
先在第一个界面的点击事件中把值传给单例对象;
再在需要接收所传的值的那里接收单例对象传过来的值;
*/


(二)在.m文件里面

/*
 static 保值作用
    1,清零作用
    2,保值作用(只会初始化一次)
    3,隐藏功能
 单例。单:唯一性。例:实例对象。即使⽤用某个类创建的对象是程
 序中唯一的实例对象。注:通常每次使用alloc创建的是不同的对象。
 如果一个类只能创建一个对象,称为单例类。单例类可以是工具类, 视图类,控制器类。

操作单例对象的变量(指针)存储在静态区,程序关闭后由系统自动回收。
单例对象存储在堆区,不释放,程序关闭后由系统自动回收。
变量和单例对象的⽣命周期与程序同步。
 
 //单例:在静态区初始化一个对象,在这个程序结束之后 才会被释放
 //第一次调用这个方法,单例对象就会被创建,之后不需要创建,直接使用就行了
 //单例类声明的对象,在第一次初始化之后,就会在静态区存在,在程序结束之后才会被释放,不会第二次初始化
*/


//static SharedData *data = nil;//这句话也可以写在里面(如“key”)
+(instancetype)shareData
{
    static SharedData *data = nil;  //“key”
/*
    //第一种
    if (data == nil) {
        data = [[SharedData alloc] init];
    }
*/
/*
    //第二种:dispatch_once代表同一时间内,只有一个线程可以访问这个类
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        if (!data) {
            data = [SharedData new];
        }

    });
*/

    //第三种:(锁定data对象,保证data创建过程的原子性)
    @synchronized(self) {
        if (!data) {
            data = [[SharedData alloc] init];
        }
    }
    return data;
}


你可能感兴趣的:(iOS)