• iOS中的单例模式


    单例模式是日常开发工作中经常会用到的一种设计模式。通过单例模式,可以保证程序中的一个类只有一个实例,从而方便对实例个数的控制以节省系统资源。因此,如果希望系统中的某个类只有一个实例,那单例模式是比较好的解决方案。

    iOS开发中,最常见的单例就是UIApplication。

    简单介绍一下iOS中如何实现单例设计模式。

    在iOS中,所有对象内存空间的分配,最终都会调用 allocWithZone方法。也就是说,当我们写下如下代码时:

    UIButton *btn = [[UIButton alloc] init];

    实际上会调用 allocWithZone 方法。因此实现单例时,可以重写 allocWithZone 方法。

    另外,GCD 提供了一个方法,是专门用来创建单例的。提供的是 dispatch_once 宏。可以保证块代码中的指令只被执行一次,且多线程时,是线程安全的,类只会被实例化一次。

    重写 allocWithZone 方法的代码:

    //重写allocWithZone方法实现单例
    //GCD提供了一个方法来创建单例,该方法是线程安全的
    + (id)allocWithZone:(struct _NSZone *)zone
    {
        static Singleton *instance;
        //dispatch_once是线程安全的,onceToken默认为0
        //且dispatch_once 可以保证块代码中的指令只被执行一次
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            instance = [super allocWithZone:zone];
        });
        return instance;
    }

    这样,再实例化类对象时,实际上返回的是一个唯一对象。

    为了方便外界访问该实例,可以实现一个 shared***方法,返回该类的实例,代码如下:

    + (instancetype)sharedSingleton
    {
        return [[self alloc] init];
    }

    验证代码如下:

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        Singleton *single = [[Singleton alloc] init];
        NSLog(@"single = %@",single);
        
        Singleton *single2 = [Singleton sharedSingleton];
        NSLog(@"single2 = %@",single2);
        
        for(int i = 0; i < 10; ++i){
            Singleton *testSingle = [[Singleton alloc] init];
            NSLog(@"testSingle = %@",testSingle);
        }
    }

    执行结果:

    可以看出,无论是多次 alloc ,还是 shared***,得到的实例对象内存地址都是一样的,说明类的实例只有一个。

  • 相关阅读:
    腾讯精选50题算法【二叉搜索树的最近公共祖先】
    潜水一周,我精心整理了两个超级有用的职场生存之道
    全球用尽IPv4的一点思考
    Leetcode算法【114. 二叉树展开为链表】
    【翻译】全新16英寸MacBook Pro评测:开发人员的梦想成真
    Medium高赞系列,如何正确的在Stack Overflow提问
    Typora+PicGo+GitHub实现md自带图床效果
    SpringBoot输出日志到文件
    Mybatis用SQL做自连表查询
    IDEA实用插件推荐及使用方法详解
  • 原文地址:https://www.cnblogs.com/acBool/p/5137591.html
Copyright © 2020-2023  润新知