iOS单例模式

  • 单例模式可以保证在程序运行的过程中,一个类只存在一个对象,而且该实例易于供外界访问。这个对象只有在该程序运行结束后才会销毁。

  • 因为只存在一个对象,所以我们保证每次调用alloc生成的对象是同一块地址即可,但是使用alloc的时候,alloc会调用其父类的allocwithzone方法分配内存,所以我们要重写allocwithzone方法

  • 实现单例模式有两种方法。

方法1:GCD方式实现

1.allocwithzone方法的重写

static Person *_person;

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

2.实现单例的shared方法

+ (instancetype)sharedPerson
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _person = [[self alloc] init];
    });
    return _person;
}

3.重写copy方法

@interface Person() <NSCopying>

@end

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

方法二:加锁实现

1.allocwithzone方法的重写

static Person *_person;

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

2.实现单例的shared方法

+ (instancetype)sharedPerson
{
    @synchronized (self) {
        if (_person == nil) {
            _person = [[self alloc] init];
        }
    }
    return _person;
}

3.重写copy方法

@interface Person() <NSCopying>

@end

- (id)copyWithZone:(NSZone *)zone
{
    return _person;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 单例模式作用 可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界使用 从而方便地控制了实例个数,并...
    珍此良辰阅读 1,368评论 3 8
  • 在项目中我们经常会使用到单例,今天我个人就说说我眼中的单例。首先说一说什么是单例呢?使用单例的好处有哪些呢?单例是...
    谁遇而安阅读 1,117评论 1 2
  • 简介: 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统...
    RunnerFL阅读 659评论 0 0
  • (1)单例模式 在程序运行过程,一个类只有一个实例 (2)使用场合 在整个应用程序中,共享一份资源(这份资源只需要...
    奥斯卡先生阅读 344评论 1 0
  • 这是我亲身经历的真实事件! 某个安宁轻松的周末,身为少女的我…对,没错!很多年前我还是一名少女时,碰巧闺蜜全忙只能...
    暗夜轻烟阅读 601评论 1 51