美文网首页
IOS-GCD实现单例模式

IOS-GCD实现单例模式

作者: 温学振 | 来源:发表于2017-12-14 17:56 被阅读10次

    单粒是一种设计模式,目的是禁止多次访问内存

    在程序运行中 无论创建多少个对象都只有一个实例 (1个类1个对象),只共享一个资源

    既然是多次禁止访问内存,并且是只有一个实例,那我们可以从alloc着手

    同时因为GCD的dispatch_once_t是在整个程序中只执行一次的

     static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
    
        });
    
    那么如何写单例呢? 例子说明
    .h文件内
    
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    /** 名字 */
    @property (nonatomic, strong) NSString *name;
    
    //这里是仿apple的命名方式,可参考 [UIApplication sharedApplication]
    + (instancetype)sharedPerson;
    
    @end
    
    不管share(把1次alloc分享给大家)Person调用多少次 _person的alloc永远只有1次
    @interface Person() <NSCopying>
    
    @end
    
    @implementation XMGPerson
    .m文件内
    static Person *_person;
    + (instancetype)sharedPerson
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            //alloc方法在内部其实是调用了 allocWithZone
            _person = [[self alloc] init];
        });
        return _person;
    }
    @end
    
    改变他们的地址 也就是直接改变alocWithZone
    + (instancetype)allocWithZone:(struct _NSZone *)zone
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _person = [super allocWithZone:zone];
        });
        return _person;
    }
    
    如果调用了person的copy 防止内存有所变化
    单粒是不会死的 因为有一个全局的指针一直指着ta
    - (id)copyWithZone:(NSZone *)zone
    {
        return _person;
    }
    

    其实我们也可以将控制器设置成单粒模式,比如说登录控制器。在没有登录的情况下,每次点击某个按钮,都先弹出这个用单粒模式设计过的登录控制器

    相关文章

      网友评论

          本文标题:IOS-GCD实现单例模式

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