iOS单例模式

今天去面试,对方公司给的试卷中有一道题是写单例模式,面试的时候也问了我单例模式的优缺点。老实说回答得相当不好,对方也指出了我代码中的不严谨。回来自己从新查找了一下资料,重新总结了一下。
主要优点:
1、提供了对唯一实例的受控访问。
2、由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
3、允许可变数目的实例。

主要缺点:
1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
2、单例类的职责过重,在一定程度上违背了“单一职责原则”。
3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失.

以下是相对严谨的做法

#import <Foundation/Foundation.h>

@interface Person : NSObject<NSCopying, NSMutableCopying>
+ (instancetype)sharePerson;
@end
#import "Person.h"

//全局
static Person *_person;

@implementation Person

//初始化方法
- (instancetype)init{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _person = [super init];
    });
    return _person;
}

//单例方法
+ (instancetype)sharePerson{
    return [[self alloc] init];
}

//alloc会调用allocWithZone,确保使用同一块内存地址
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _person = [super allocWithZone:zone];
    });
    return _person;
}

//copy的时候会调用copyWithZone
- (id)copyWithZone:(NSZone *)zone{
    return _person;
}

+ (id)copyWithZone:(struct _NSZone *)zone{
    return _person;
}

+ (id)mutableCopyWithZone:(struct _NSZone *)zone{
    return _person;
}

- (id)mutableCopyWithZone:(NSZone *)zone{
    return _person;
}
Person *person1 = [[Person alloc]init];
    Person *person2 = [Person sharePerson];
    Person *person3 = [[Person alloc]init];
    Person *person4 = [person3 mutableCopy];
    Person *person5 = [person4 copy];
    NSLog(@"%p %p %p %p %p", person1, person2, person3, person4, person5);
// 0x170001ad0 0x170001ad0 0x170001ad0 0x170001ad0 0x170001ad0
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 简介: 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统...
    RunnerFL阅读 649评论 0 0
  • 单例介绍 本文源码下载地址 1.什么是单例 说到单例首先要提到单例模式,因为单例模式是单例存在的目的 单例模式是一...
    雷鸣1010阅读 3,543评论 0 19
  • 单例模式作用 可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界使用 从而方便地控制了实例个数,并...
    珍此良辰阅读 1,363评论 3 8
  • 一. 单例模式简介 单例模式的作用可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问从而方便地控...
    xx_cc阅读 50,273评论 15 146
  • 吾叔我在珠宝玉石行业混迹十三年,投资收藏过黄蜡石,南红,战国红,和田玉,碧玉,青金石.....还有很多玉种。 谈这...
    吾叔阅读 955评论 0 0