美文网首页iOS归纳
iOS-生成一个单例对象

iOS-生成一个单例对象

作者: 叫我龙哥 | 来源:发表于2021-04-22 10:00 被阅读0次

浅谈生成一个单例

单例作为非常常用的一个设计模式来说,是每个Coder必备的技能之一,但是还有很多人可能写了个假单例,就是我换种实例化方法可能就生成了一个新的对象。

1、为什么要生成一个单例对象

  • 为了确保在整个应用期间只有一个实例,以达到用户的特定的使用目的。
  • 对于频繁使用的对象,可以把多次创建对象所花费的时间节省下来,提高运行效率。
  • 如果对象所占用的空间大,那么就可以节省大量不必要的空间,降了内存压力。

2、生成单例需要注意的问题

  • 不同实例化方法可能返回不同的对象

3、如何生成一个单例

首先在当前类文件中声明一个全局静态对象

@implementation TestObjectClass
static  TestObjectClass *_testClass = nil;

写一个类方法,初始化全局静态对象

+ (instancetype)shareObject{
    if (_testClass == nil) {
        _testClass = [[super alloc]init];
    }
    return _testClass;
}

重写allocWithZone方法,拦截alloc方法,防止生成新对象(使用synchronized,并优化同步锁)

+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    if (_testClass == nil) {
        @synchronized (self) {
            if (_testClass == nil) {
                _testClass = [super allocWithZone:zone];
            }
        }
    }
    return _testClass;
}

重写allocWithZone方法,拦截alloc方法,防止生成新对象(使用dispatch_once)

+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (_testClass == nil) {
            _testClass = [super allocWithZone:zone];
        }
    });
    return _testClass;
}

重写copyWithZone方法,拦截copy方法,防止生成新对象

- (id)copyWithZone:(nullable NSZone *)zone {
    return _testClass;
}

重写mutableCopyWithZone方法,拦截mutableCopy方法,防止生成新对象

- (id)mutableCopyWithZone:(nullable NSZone *)zone {
    return _testClass;
}

如有纰漏请多多指教。
简书:https://www.jianshu.com/p/03eb4f2203bd
CSDN:https://blog.csdn.net/ZuoWeiXiaoDuZuoZuo/article/details/116001644

相关文章

  • iOS-生成一个单例对象

    浅谈生成一个单例 单例作为非常常用的一个设计模式来说,是每个Coder必备的技能之一,但是还有很多人可能写了个假单...

  • PHP设计模式

    1,单例模式(Singleton):用于为一个类生成一个唯一的对象。 最常用的地方是数据库连接。 使用单例模式生成...

  • iOS中的单例

    什么是单例,为什么要用单例? 1,单例模式: 确保某一个类只有一个实例。单例模式只会生成一个对象。内存空间永远是一...

  • android单例模式

    单例模式解释 单例模式是一种对象创建性模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程...

  • 设计模式 - 懒汉模式与饿汉模式

    一、单例模式 单例模式是一种对象创建模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序...

  • Python单例模式

    单例类 单例类采用重载new方法,返回一个类对象 实例化的类对象由new方法生成 new方法在 init方法调用前...

  • 好未来

    1.设计并实现单例模式 原理: ①单例类只能有一个实例 ②这个实例只能由单例类来生成 ③必须给所有其他对象提供这个...

  • Scala中单例类型及其使用场景

    在Scala中,任何对象(包括单例对象和非单例对象)都存在单例类型,每个单例类型只有唯一的一个实例。 单例对象: ...

  • 单例创建(Singleton)

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

  • 设计模式

    1.设计并实现单例模式 要求:①单例类只能有一个实例②这个实例只能由单例类来生成③必须给所有其他对象提供这个实例目...

网友评论

    本文标题:iOS-生成一个单例对象

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