单例模式的实现

1.单例模式的作用

  • 可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问.
  • 从而方便的控制了实例个数,并节约系统资源

2.单例模式的使用场合

  • 在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次)

3.单例模式的实现

  • 实现单例模式,共有两种方法.一种较为复杂.一种比较简易

第一种: 复杂实现方法

  • 优点 : 外界调用这个工具类时,可以通过类方法来获取单例,也可以通过alloc的方法来获取单例
// 1.提供静态变量
static MTYTool * _instance;

// 2.重写该方法,保证只分配一次内存空间
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [super allocWithZone:zone];
    });
    return _instance;
    
}

// 3.提供类方法
+ (instancetype)shareTool {
    return [[self alloc] init];
}

// 4.更加严谨的做法
- (id)copyWithZone:(NSZone *)zone {
    return _instance;
}

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

外界调用测试

- (void)viewDidLoad {
    [super viewDidLoad];

    MTYTool *t1 = [[MTYTool alloc] init];
    MTYTool *t2 = [MTYTool new];
    
    // 打印结果: t1--<MTYTool: 0x600000011d10>, t2--<MTYTool: 0x600000011d10
//    NSLog(@"t1--%@, t2--%@",t1,t2);
    
    // 打印结果: t1--<MTYTool: 0x608000000e30>, t2--<MTYTool: 0x608000000e30>, ---<MTYTool: 0x608000000e30>,---<MTYTool: 0x608000000e30>
//    NSLog(@"t1--%@, t2--%@, ---%@,---%@", t1, t2, [MTYTool shareTool], [MTYTool shareTool]);
    
    // 打印结果: t1--<MTYTool: 0x6000000137c0>, t2---<MTYTool: 0x6000000137c0>, <MTYTool: 0x6000000137c0>, <MTYTool: 0x6000000137c0>
//    NSLog(@"t1--%@, t2---%@, %@, %@",t1, t2, [t1 copy], [t1 mutableCopy]);

第二种: 简易实现方法

  • 弊端 : 外界调用这个工具类时,只能通过类方法来获取单例,不能通过alloc的方法来获取单例了
+ (instancetype)shareDownloadTool {
    
    static MTYEasyTool *_instance;
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[self alloc] init];
    });
    
    return _instance;
}

外界调用测试

- (void)viewDidLoad {
    [super viewDidLoad];

    MTYEasyTool *easy1 = [MTYEasyTool shareDownloadTool];
    MTYEasyTool *easy2 = [MTYEasyTool shareDownloadTool];
    // 打印结果:1--<MTYEasyTool: 0x600000004cd0>, 2--<MTYEasyTool: 0x600000004cd0>
    NSLog(@"1--%@, 2--%@", easy1, easy2);
    
    MTYEasyTool *easy3 = [[MTYEasyTool alloc] init];
    MTYEasyTool *easy4 = [[MTYEasyTool alloc] init];
    // 打印结果:3--<MTYEasyTool: 0x60800001ce90>, 4--<MTYEasyTool: 0x60800001cea0>
    NSLog(@"3--%@, 4--%@",easy3, easy4);
}
posted @ 2017-02-18 11:07  Oo11  阅读(222)  评论(0编辑  收藏  举报