首页 > 技术文章 > iOS单例详解

shpyoucan 2016-10-24 14:44 原文

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

  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再得到一个一模一样的对象。

 

推荐阅读