iOS单例模式

今天才知道单例模式分为严格单例模式不严格单例模式

单例模式要求一个类有一个实例,有公开接口可以访问这个实例。

严格单例模式,要求一个类只有一个实例;不严格单例模式,可以创建多个实例。

严格单例模式:重载 copy()、mutableCopy() 方法,返回 self,防止在外部复制实例

不严格单例模式: 继承自 NSObject,重载 copy()、mutableCopy() 方法,创建新实例,传递数据给新实例,返回新实例。其他与严格单例模式相同。

1.不重载 copy()、mutableCopy() 方法:

- (void)viewDidLoad {
    [super viewDidLoad];

    // 不写allocWithZone <Singleton: 0x60000001b020>-<Singleton: 0x60000001b090>-<Singleton: 0x60000001b020>
    
    Singleton *instance = [Singleton shared];
    Singleton *instance1 = [[Singleton alloc]init];
    Singleton *instance2 = [Singleton shared];
    NSLog(@"%@-%@-%@",instance, instance1, instance2);
}

2.重载 copy()、mutableCopy() 方法:

//
//  Singleton.m
//  单例模式
//
//  Created by 思 彭 on 2017/4/28.
//  Copyright © 2017年 思 彭. All rights reserved.
//

#import "Singleton.h"

static id shared;

@implementation Singleton

// 仅实现此方法则是不严格单例

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

// 实现以下方法即是:严格单例

/**
 重载 allocWithZone: 和 init 方法,由 dispath_once 保证父类方法只执行一次并给 shared 赋值,返回 shared。外部调用初始化方法总是获得 shared 持有的唯一实例。
 @param zone <#zone description#>
 @return <#return value description#>
 */
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        shared = [super allocWithZone:zone];
    });
    return shared;
}

- (instancetype)init {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        shared = [super init];
    });
    return shared;
}


/**
 重载 copyWithZone: 和 mutableCopyWithZone: 方法,返回 self,防止在外部复制实例。由于只有一个实例 shared,只能由 shared 调用 copy、mutableCopy 方法,那么 self 就是 shared。

 @param zone <#zone description#>
 @return <#return value description#>
 */
- (id)copyWithZone:(NSZone *)zone {
//    return self;
    return [[self.class allocWithZone:zone]init];
}

- (id)mutableCopyWithZone:(NSZone *)zone {
//    return self;
    return [[self.class allocWithZone:zone]init];
}

// Optional
- (void)reset {
    // Reset all properties to default value
}

@end

返回结果:

<Singleton: 0x608000019a30>-<Singleton: 0x608000019a30>-<Singleton: 0x608000019a30>

 

好像没发现啥区别??

不重载方法:alloc和单例创建的是不一样的对象;

重载了方法: alloc和单例创建的是一样的对象;

 

可以参考这个博客,挺详细:  http://www.cnblogs.com/silence-cnblogs/p/6776217.html

 

你简单的理解,欢迎给我留言!!谢谢哟!

 

posted on 2017-04-28 10:04  玉思盈蝶  阅读(145)  评论(0编辑  收藏  举报

导航