iOS开发 单例 深入探究

一、单例的定义

在程序的整个运行过程中,只创建一个对象实例,内存地址一直不变,就叫做单例。


单例模式图示

二、iOS中的单例

cocoa框架中常用的是:

  • UIApplication
  • NSNotificationCenter
  • NSFileManager
  • NSUserDefaults
  • NSURLCache

三、单例模式的优缺点

优点:

1.减少内存开支(对象需要频繁的创建和销毁)
2.减少系统的性能开销
3.避免对同一资源的同时读写操作,优化和共享资源访问

缺点:

1.没有抽象层,扩展困难,想要扩展就必须要修改代码
2.职责太重,违背了“单一职责原则”
3.在多线程中使用单例,需要多该单例成员进行线程互斥处理

四、自定义一个单例类

.h
#import 

NS_ASSUME_NONNULL_BEGIN

/// 自定义一个单例类
@interface GQSingletonTool : NSObject

/// 初始化方法
+ (instancetype)shareInstance;

@end
.m

一般的写法(不完美,但是够用):

#import "GQSingletonTool.h"

@implementation GQSingletonTool

+ (instancetype)shareInstance {
    static GQSingletonTool *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[GQSingletonTool alloc] init];
    });
    return instance;
}

@end

上面写法的缺陷,在于如果不使用规定的 shareInstance 方法来初始化,而是采用 alloc init 的话,就没法保证生成的是单例的对象了。
完备的写法:

#import "GQSingletonTool.h"

@implementation GQSingletonTool

// 初始化(单例方法)
+ (instancetype)shareInstance {
    static GQSingletonTool *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[GQSingletonTool alloc] init];
    });
    return instance;
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    return [GQSingletonTool shareInstance];
}

+ (instancetype)alloc {
    return [GQSingletonTool shareInstance];
}

- (id)copy {
    return self;
}

- (id)mutableCopy {
    return self;
}

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

@end

你可能感兴趣的:(iOS开发 单例 深入探究)