美文网首页
iOS 3种单例模式

iOS 3种单例模式

作者: _Bob_ | 来源:发表于2018-05-24 16:51 被阅读48次

    大概12年还在学习iOS,之后转战cocos unity,但到ios端始终会见到OC。单例模式一直用的非常古老的懒加载,最近重新复习了一下OC记录一下。

    首先了解一下instancetype 与id的相同与区别。

    相同点:都是万能指针,指向对象

    不同点: 

    1.id在编译的时候不能判断对象的真实类型,instancetype在编译的时候可以判断对象的真实类型

    2.id可以用来定义变量,可以作为返回值类型,可以作为形参类型;instancetype只能作为返回值类型

    1.懒加载(现在已经不推荐这种方法了,线程不安全)

    #import "SingletonVC.h"

    static SingletonVC * _singletonVC;

    @implementation SingletonVC

    + (instancetype)allocWithZone:(struct _NSZone *)zone{

        if(_singletonVC == nil) {

            _singletonVC = [superallocWithZone:zone];

        }

        return_singletonVC;

    }

    + (instancetype)share{

        return[[self alloc] init];}

    @end

    2.GCD的一次函数

    #import "single.h"

    staticsingle*_singleVC;

    @implementation single

    +(instancetype)allocWithZone:(struct_NSZone*)zong

    {

        staticdispatch_once_tonceToken;

        dispatch_once(&onceToken, ^{

            if(_singleVC==nil)

            {

                _singleVC= [superallocWithZone:zong];

            }

        });

        return _singleVC;

    }

    +(instancetype)share

    {

        return[[selfalloc]init];

    }

    @end

    3.线程锁

    #import "SingletonVC.h"

    static SingletonVC * _singletonVC;

    @implementation SingletonVC

    + (instancetype)allocWithZone:(struct _NSZone *)zone{

        @synchronized (self) {

            if(_singletonVC == nil) {

                _singletonVC = [superallocWithZone:zone];

            }

        }

        return_singletonVC;

    }

    + (instancetype)share{

        return[[self alloc] init];

    }

    @end

    相关文章

      网友评论

          本文标题:iOS 3种单例模式

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