美文网首页
GCD与非GCD实现单粒设计模式

GCD与非GCD实现单粒设计模式

作者: zhazha | 来源:发表于2015-07-15 00:08 被阅读118次

GCD实现设计模式

在某个类里面实现GCD单粒设计模式

  • 类的.h文件
@interface ZMJPerson : NSObject

+ (instancetype)sharedInstance;

@end
  • 类的.m文件
// 实例变量,当前类
static id _instance;

// 重写allocWithZone方法
+ (instancetype)allocWithZone:(struct _NSZone *)zone{

    static dispatch_once_t onceToken;

    // 该方法整个应用程序只调用一次
    dispatch_once(&onceToken, ^{
        _instance = [super allocWithZone:zone];
    });
    return _instance;
}

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

// 保证每复制一个对象也是同一个内存空间
- (id)copyWithZone:(NSZone *)zone{
    return _instance;
}

宏定义封装GCD单粒设计模式(1)

  • 将实现单粒设计模式的代码放到宏定义里面,并且专门搞个.h文件存储该宏定义,使用的之后直接导入头文件即可,不必在每个类中实现单粒设计模式
  • 注意:每行结尾需要添加\
// .h文件
#define ZMJSingletonH  + (instancetype)sharedInstance;

// .m文件
#define ZMJSingletonM \
static id _instance;\
\
+ (instancetype)allocWithZone:(struct _NSZone *)zone{\
    \
    static dispatch_once_t onceToken;\
    dispatch_once(&onceToken, ^{\
        _instance = [super allocWithZone:zone];\
    });\
    return _instance;\
}\
\
+ (instancetype)sharedInstance{\
    static dispatch_once_t onceToken;\
    dispatch_once(&onceToken, ^{\
        _instance = [[self alloc] init];\
    });\
    return _instance;\
}\
\
- (id)copyWithZone:(NSZone *)zone{\
    return _instance;\
}

宏定义封装GCD单粒设计模式(2)

  • 如果希望每次有特有的类名,可以使用##拼接宏
// .h文件
#define ZMJSingletonH(name)  + (instancetype)shared##name;

// .m文件
#define ZMJSingletonM(name) \
static id _instance;\
\
+ (instancetype)allocWithZone:(struct _NSZone *)zone{\
\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [super allocWithZone:zone];\
});\
return _instance;\
}\
\
+ (instancetype)shared##name{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [[self alloc] init];\
});\
return _instance;\
}\
\
- (id)copyWithZone:(NSZone *)zone{\
return _instance;\
}

非GCD实现设计模式

  • 就介绍怎么使用,其它宏定义保存跟上面一样

  • ZMJPerson类的.h文件

@interface ZMJPerson : NSObject

+ (instancetype)sharedInstance;

@end
  • ZMJPerson类的.h文件
static id _instance;
+ (instancetype)allocWithZone:(struct _NSZone *)zone{

    // 同步锁,防止多线程同时进入
    @synchronized(self){

        if (_instance == nil) {
            _instance = [super allocWithZone:zone];
        }

    }
    return _instance;
}

+ (instancetype)sharedInstance{

    @synchronized(self){

        if (_instance == nil) {
            _instance = [[self alloc] init];
        }

    }
    return _instance;
}

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

注意点

  • 一般当两个类有相同的属性和方法,我们会考虑将相同的部分抽取出来,封装到父类,让这两个类成为它的子类,但单粒设计模式不可以这样做;
  • 因为start修饰的变量在内存中只有一份内存,如果单粒设计模式采用继承的方式的话,所有的类共享一份内存;
  • 其实我们只要保证每一个类的对象只有一份内存即可

相关文章

  • GCD与非GCD实现单粒设计模式

    GCD实现设计模式 在某个类里面实现GCD单粒设计模式 类的.h文件 类的.m文件 宏定义封装GCD单粒设计模式(...

  • 单例模式和GCD单例实现

    1、传统单例模式2、GCD单例模式3、用宏实现GCD单例模式4、用宏实现GCD单例模式,名称随类名变化而变化 单例...

  • swift 单例

    1、最简单实现 2、使用GCD技术实现的单例模式

  • 学习笔记:GCD创建单粒

    // GCD单粒static WMObject *_instance;+ (instancetype)allocW...

  • 单例类

    GCD实现单例模式 当[[self alloc] init]时,会默认调用+ (instancetype)allo...

  • OC高级-GCD使用总结

    GCD简介 GCD全称:Grand Central Dispatch,译为大型的中枢调度器 纯C语言实现,提供了非...

  • iOS 单例(singleton,GCD,@synchroniz

    iOS中单例模式的两种创建方法:GCD 和 @synchronize 1.GCD的方法 1.重写allocWith...

  • GCD与单例模式

    什么是GCD 全称是Grand Central Dispatch,纯C语言,提供了非常多强大的函数 GCD的优势 ...

  • 面试目录

    一面: 设计模式 Notification、Delegate KVO、KVC block NSThread、GCD...

  • swift3.0+实现持续震动和取消震动

    只是简单的实现功能,使用GCD延迟循环调用,主要是swift对gcd写法的改变,可以写个单例,全局调用,方法内部可...

网友评论

      本文标题:GCD与非GCD实现单粒设计模式

      本文链接:https://www.haomeiwen.com/subject/ehnuqttx.html