iOS OC创建单例(Singleton)

作者: 小秀秀耶 | 来源:发表于2017-11-16 11:19 被阅读765次

昨天总结了swift的单例创建模式,今天总结一下OC单例的创建模式,本人才疏学浅,如有错误之处,还望大家指出。

创建单例最初的学习到的写法是判断对象是否为空,为空才创建,但这仅仅是单线程安全,为了多线程安全,创建单例时会加锁,写法如下

+ (instancetype)shareManager{
    @synchronized(self){
        if (!manager) {
            manager = [[DataManager alloc]init];
        }
        return manager;
    }
}

后来发现GCD创建单例更加简便

static DataManager *manager = nil;

@implementation DataManager

+ (instancetype)shareManager{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[DataManager alloc] init];
        //    [[super allocWithZone:nil] init]; 在某些博客说如果重写allocWithZone方法,此时调用[[DataManager alloc] init]会导致死循环,尝试后发现,没有出现这种情况。
    });
    return manager;
}
@end

此时单例就已经写好了,只要我们在外面调用shareManager这个方法,返回的对象始终是一个,因为dispatch_once只执行一次。
但是如果我们不小心调用了alloc、copy、mutablecopy(因为本文的DataManager继承自NSObject,默认DataManager实现了NSCopying,NSMutableCopying协议,否则copy、mutablecopy会导致崩溃) 返回的对象就不是同一个了,因为这些操作会生成新的对象,要保证单例的唯一性就需要重写这些方法。

+ (instancetype)alloc{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[super alloc]init];
        NSLog(@"allocWithZone----");
    });
    return manager;
}
- (nonnull id)copyWithZone:(nullable NSZone *)zone {
    //    return self; 此处返回self或者manager 打印的对象是同一个,并没有发现什么区别
    return manager;
}

- (nonnull id)mutableCopyWithZone:(nullable NSZone *)zone {
    //    return self; 此处返回self或者manager 打印的对象是同一个,并没有发现什么区别
    return manager;
}

又发现有的博客中提到了重写allocWithZone,查询资料后发现,我们调用alloc方法系统最终会调用allocWithZone,所以重写alloc 或者allocWithZone基本上是一样的。NSZone是Apple用来分配和释放内存的一种方式,alloc 和allocWithZone 的区别,在下面我给出参考博客的地址。

+ (id)allocWithZone:(struct _NSZone *)zone{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [super allocWithZone:zone];
        NSLog(@"allocWithZone----");
    });
    return manager;
}

到此ARC机制下的单例创建就完成了,单例主要用在封装网络请求,播放器,存放常用数据,单例只初始化一次,整个APP随处可以访问,使用方便。
期间参考了很多地址,如有遗漏,还请见谅。
参考地址:
iOS-单例模式写一次就够了
iOS开发多线程篇—单例模式
从 Objective-C 里的 Alloc 和 AllocWithZone 谈起
Objective-C copy,看我就够了

相关文章

  • iOS OC创建单例(Singleton)

    昨天总结了swift的单例创建模式,今天总结一下OC单例的创建模式,本人才疏学浅,如有错误之处,还望大家指出。 创...

  • iOS swift创建单例(Singleton)

    由于需要封装一个数据的的单例,所以在网上搜索了创建单例的方法。具体的单例是什么?以及单例优缺点,在这里作为菜鸟的我...

  • iOS - 单例创建

    Swift创建单例 代码如下:Swift5 对应OC创建单例

  • iOS单例

    iOS 单例[https://www.cnblogs.com/dins/p/ios-singleton.html]...

  • 单例模式 Singleton Pattern

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

  • 单例创建(Singleton)

    iOS-单例模式写一次就够了 一. 单例模式简介 单例模式的作用 可以保证在程序运行过程,一个类只有一个实例,而且...

  • 设计模式[1]-单例模式-Singleton Pattern

    1. 单例模式简介 单例模式(Singleton Pattern)是创建型模式(Creational Patter...

  • Swift单例模式

    参考:http://swifter.tips/singleton/ OC写法 在 Objective-C 中单例的...

  • (Weak Singleton)弱单例优化

    (Weak Singleton)弱单例优化 在 OC 中 在 swift 中 优化前: 优化后:

  • Spring--Bean创建细节

    一.对象创建单例/多例 scope="singleton", 默认值, 即 默认是单例 【service/da...

网友评论

    本文标题:iOS OC创建单例(Singleton)

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