iOS单例详解

单例:整个程序只建立一次,全局共用。安全

  1. 单例的建立
    // SharedPerson.h 文件中
    + (instancetype)share;
    // SharedPerson.m 文件中
    static SharedPerson *_person;
    + (instancetype)allocWithZone:(struct _NSZone *)zone{
        static dispatch_once_t predicate;
        dispatch_once(&predicate, ^{
            _person = [super allocWithZone:zone];
        });
        return _person;  
    }
    
    + (instancetype)share {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _person = [[self alloc]init];
        });
        return _person;
    }
    - (id)copyWithZone:(NSZone *)zone { return _person; }

     

  2. 分析单例
    • static SharedPerson *_person : 利用static关键字来确保建立的单例对象_person只能在此类中能够访问到;将_person定义成全局变量为了确保其生命周期存在于整个程序中,期间不被销毁.
    • dispatch_once : 此函数确保_person对象在程序中只会建立一次,而且也保证了建立时的线程安全。
    • + (instancetype)share : 提供便捷的类方法来建立单例对象,强烈建议用此法建立对象。
    • + (instancetype)allocWithZone:(struct _NSZone *)zone : [SharedPerson alloc]分配对象内存时,实际会调此函数allocWithZone:(struct _NSZone *)zone,因此须要重写此方法来保证单例对象只会建立一次,并且是必须重写此方法,防止其余开发者直接用初始化方法来建立单例对象函数

    • - (id)copyWithZone:(NSZone *)zone : 此函数来保证单例对象能够copy再获得一个如出一辙的对象。spa

相关文章
相关标签/搜索