单例MJ

作者: March_Cullen | 来源:发表于2017-03-08 22:08 被阅读0次
// Singleton.h
// 帮助实现单例设计模式,代码同时兼容ARC和非ARC工程;定义两个宏,在其他工具类直接调用宏,就可以实现单例模式
// alloc方法内部会调用allocWithZone:

// .h文件的实现
#define SingletonH(methodName) + (instancetype)share##methodName;

// .m文件的实现
#if __has_feature(objc_arc) // 是ARC
#define SingletonM (methodName) \
static id _instance = nil; \
+ (id)allocWithZone:(struct _NSZone *)zone { \
if (_instance == nil) { \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [super allocWithZone:zone]; \
}); \
} \
return _instance; \
} \
 \
- (id)init { \
static dispatch_once_t onceToken; \
dispatch_once( &onceToken, ^{ \
_instance = [super init]; \
}); \
return _instance; \
} \
 \
+ (id)copyWithZone:(struct _NSZone *)zone { \
    return _instance; \
} \
 \
+ (id)mutableCopyWithZone:(struct _NSZone *)zone { \
return _instance; \
} \
 \
+ (instancetype)share##methodName { \
return [[self alloc] init]; \
}
#else // 不是ARC
#define SingletonM (methodName) \
static id _instance = nil; \
+ (id)allocWithZone:(struct _NSZone *)zone { \
if (_instance == nil) { \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [super allocWithZone:zone]; \
}); \
} \
return _instance; \
} \
 \
- (id)init { \
static dispatch_once_t onceToken; \
dispatch_once( &onceToken, ^{ \
_instance = [super init]; \
}); \
return _instance; \
} \
 \
+ (id)copyWithZone:(struct _NSZone *)zone { \
    return _instance; \
} \
 \
+ (id)mutableCopyWithZone:(struct _NSZone *)zone { \
return _instance; \
} \
 \
+ (instancetype)share##methodName { \
return [[self alloc] init]; \
} \
 \
- (oneway void)release { \
 \
} \
 \
- (id)retain { \
return self; \
} \
 \
- (NSInteger)retainCount { \
return 1; \
}
// 注意最后一行不要加\,加\的意思是该行的下一行是宏定义的部分
// LYSoundTool.h
#import <Foundation/Foundation.h>
#import “Singleton.h”
@interface LYSoundTool : NSObject
SingletonH(SoundTool) // 在.h文件里面使用SingletonH宏定义
@end
// LYSoundTool.m
#import “LYSoundTool.h”
@interface LYSoundTool()
@end
@implementation LYSoundTool
SingletonM(SoundTool) // 在.m文件里面使用SingletonM宏定义
@end
// LYHttpTool.h
#import <Foundation/Foundation.h>
#import “Singleton.h”
@interface LYHttpTool : NSObject <NSCoping>
SingletonH(HttpTool)
@end
// LYHttpTool.m
#import “LYHttpTool.h”
@implementation LYHttpTool
SingletonM(HttpTool)
@end
</pre>

相关文章

  • 单例MJ

  • iOS设计模式-----单例模式

    单例模式 这个单例模式的写法是参照MJ哥的写法。追求最精简。1.只分配一块内存来创建对象。2.提供一个类方法,返回...

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • IOS单例模式的底层原理

    单例介绍 本文源码下载地址 1.什么是单例 说到单例首先要提到单例模式,因为单例模式是单例存在的目的 单例模式是一...

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

  • 2020-11-02-Spring单例 vs. 单例模式

    Spring 单例不是 Java 单例。本文讨论 Spring 的单例与单例模式的区别。 前言 单例是 Sprin...

  • IOS学习笔记之单例

    单例介绍 1.什么是单例 说到单例首先要提到单例模式,因为单例模式是单例存在的目的 单例模式是一种常用的软件设计模...

  • OC - 单例模式

    导读: 一、什么是单例模式 二、单例的作用 三、常见的单例类 四、自定义单例类的方法 一、什么是单例模式 单例模式...

  • 单例

    单例 单例宏

  • 单例模式

    特点 单例类只有1个实例对象 该单例对象必须由单例类自行创建 单例类对外提供一个访问该单例的全局访问点 结构 单例...

网友评论

      本文标题:单例MJ

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