iOS 中的强单例和弱单例

作者: 4a3c61ff974e | 来源:发表于2017-08-07 15:55 被阅读424次

单例是什么以及作用就不单独解释了

强单例

iOS 中常见的单例模式有两种方式:

+(instancetype)sharedInstance{
    static dispatch_once_t onceToken;
    static Singleton *instance;
    dispatch_once(&onceToken, ^{
        if(!instance){
            instance = [[Singleton alloc] init];
        }
    });
    return instance;
}
+(instancetype)sharedInstance{
    static Singleton *instance = nil;
    @synchronized (self) {
        if(!instance){
            instance =[[Singleton alloc] init];
        }
    }
    return instance;
}

这也是到处都能查到的调用GCD 或互斥锁生成的单例
这种单例需要考虑的情况是如果别人直接调用 alloc 和init 方法,便生成了新的类实例
为了防止别人通过这种方式获得实例,可以使用一种更为标准的单例,以GCD 为例:

+(instancetype)sharedInstance{
    static dispatch_once_t onceToken;
    static Singleton *instance;
    dispatch_once(&onceToken, ^{
        if(!instance){
            instance = [[super allocWithZone:NULL] init];
        }
    });
    return instance;
}
+(instancetype)allocWithZone:(struct _NSZone *)zone{
    return [self sharedInstance];
}
  • 如果考虑 NSCopying 和 NSMutableCopy 协议时,还需要覆写对应方法返回单例。
    调用 alloc 方法时,可以理解为以下形式(这里可以参考 10栋208
+ (id) alloc{
    return [self allocWithZone:NULL];
}

当别人想通过 alloc 方法获取实例时,通过覆写的方法便会返回单例
而单例的创建中调用 [super allocWithZone:NULL] 是为了绕开覆写的方法,避免死循环

弱单例

通过之前的方式生成的单例对象会一直占用内存到应用程序结束,弱单例的出现便是考虑到这点,使用方式同强单例,不同点在于使用时需要对单例进行强引用,当引用计数降到0时,单例便被释放,弱单例的生成方式如下

+(instancetype)weakSharedInstance{
    static __weak Singleton *weakInstance;
    Singleton *instance = weakInstance;
    @synchronized (self) {
        if(!instance){
            instance =[[Singleton alloc] init];
            weakInstance = instance;
        }
    }
    return instance;
}

(以下为臆测,如有错误请指正)
这里利用了 ARC 机制,instance 为局部变量,返回时由自动释放池持有,使用时需要通过强引用持有这个单例,当其他对象不再持有(即不再使用时),自动释放池便会释放单例,弱引用weakInstance 置nil,下次需要使用单例时再重新创建。通过这种方式避免了单例不使用时占用内存的情况。

参考:

相关文章

  • iOS 中的强单例和弱单例

    单例是什么以及作用就不单独解释了 强单例 iOS 中常见的单例模式有两种方式: 这也是到处都能查到的调用GCD 或...

  • iOS 单例模式

    关于单例模式的详解,看完这几篇,就完全了然了。iOS 单例模式iOS中的单例模式iOS单例的写法

  • 单例

    iOS单例模式iOS之单例模式初探iOS单例详解

  • 单例模式 Singleton Pattern

    单例模式-菜鸟教程 iOS中的设计模式——单例(Singleton) iOS-单例模式写一次就够了 如何正确地写出...

  • iOS单例模式容错处理

    ios 单例模式容错处理 1、单例模式的使用和问题解决 在ios开发的过程中,使用单例模式的场景非常多。系统也有很...

  • iOS开发 单例使用问题

    iOS开发 单例使用问题 iOS开发 单例使用问题

  • iOS开发 单例使用问题

    iOS开发 单例使用问题 iOS开发 单例使用问题

  • ios~单例模式:

    在iOS OC中,一般我们都是用官方推荐的写法来写单例:GCD方式单例 分析单例 static SharedPer...

  • iOS 基础02--单例、属性修饰符、深浅拷贝

    iOS 基础02--单例、属性修饰符、深浅拷贝 单例 讲单例就必须得先讲讲单例这种设计模式的作用和最可能出现的应用...

  • iOS 单例模式 or NSUserDefaults

    本文内容:iOS的单例模式NSUserDefaults的使用总结:iOS单例模式 and NSUserDefaul...

网友评论

  • 72行代码:能不能解释下,为什么没有人调用的时候,这个弱单例会销毁呢

本文标题:iOS 中的强单例和弱单例

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