美文网首页等风来
iOS-单例模式

iOS-单例模式

作者: Imkata | 来源:发表于2020-08-10 09:59 被阅读0次

static修饰变量

  1. 修饰全局变量:全局变量的作用域仅限于当前文件内部(不加的话别人使用extern关键字就能从其他文件访问这个文件的全局变量了)。
  2. 修饰局部变量:能保证局部变量永远只初始化1次,在程序运行过程中,永远只有1分内存。局部变量的生命周期跟全局变量类似,但是不能改变作用域。

一. ARC模式下单例

#pragma mark - GCD模式单例 ARC
 
#import <Foundation/Foundation.h>
 
@interface HMDataTool : NSObject
+ (instancetype)sharedDataTool;
@end
 
#import "HMDataTool.h"
 
@implementation HMDataTool
// 用来保存唯一的单例对象
static id _instace;
 
+ (id)allocWithZone:(struct _NSZone *)zone
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instace = [super allocWithZone:zone];
    });
    return _instace;
}
 
+ (instancetype)sharedDataTool
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instace = [[self alloc] init];
    });
    return _instace;
}
 
- (id)copyWithZone:(NSZone *)zone
{
    return _instace;
}
@end

二. MRC模式下单例

#pragma mark GCD单例模式 MRC
 
#import "HMDataTool.h"
 
@implementation HMDataTool
// 用来保存唯一的单例对象
static id _instace;
 
+ (id)allocWithZone:(struct _NSZone *)zone
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instace = [super allocWithZone:zone];
    });
    return _instace;
}
 
+ (instancetype)sharedDataTool
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instace = [[self alloc] init];
    });
    return _instace;
}
 
- (id)copyWithZone:(NSZone *)zone
{
    return _instace;
}

//MRC多了这几个方法
- (oneway void)release{
}
- (id)retain {
    return self;
}
- (NSUInteger)retainCount {
    return 1;
}
- (id)autorelease {
    return self;
}
 
@end

三. 宏实现单例,自定义名称,适配ARC和MRC

#pragma mark - 宏实现单例,自定义名称,适配ARC和MRC

创建一个empty空文件命名HMSingleton.h,在.h文件中写以下宏

// .h文件
#define HMSingletonH(name) + (instancetype)shared##name;
 
// .m文件
#if __has_feature(objc_arc)
 
#define HMSingletonM(name) \
static id _instace; \
\
+ (id)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instace = [super allocWithZone:zone]; \
}); \
return _instace; \
} \
\
+ (instancetype)shared##name \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instace = [[self alloc] init]; \
}); \
return _instace; \
} \
\
- (id)copyWithZone:(NSZone *)zone \
{ \
return _instace; \
}
 
#else
 
#define HMSingletonM(name) \
static id _instace; \
\
+ (id)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instace = [super allocWithZone:zone]; \
}); \
return _instace; \
} \
\
+ (instancetype)shared##name \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instace = [[self alloc] init]; \
}); \
return _instace; \
} \
\
- (id)copyWithZone:(NSZone *)zone \
{ \
return _instace; \
} \
\
- (oneway void)release { } \
- (id)retain { return self; } \
- (NSUInteger)retainCount { return 1;} \
- (id)autorelease { return self;}
 
#endif
  1. /代表下一行是宏
  2. 使用方法:
    ① 把HMSingleton.h文件导入pch文件,创建单例继承于NSObject。
    ② 在需要使用的类的.h文件中加一句HMSingletonH(name),在.m文件中加一句HMSingletonM(name)即可,name是传进去宏的参数名。

相关文章

  • 单例模式 Singleton Pattern

    单例模式-菜鸟教程 iOS中的设计模式——单例(Singleton) iOS-单例模式写一次就够了 如何正确地写出...

  • 单例创建(Singleton)

    iOS-单例模式写一次就够了 一. 单例模式简介 单例模式的作用 可以保证在程序运行过程,一个类只有一个实例,而且...

  • ios-单例模式

    一、什么是单例模式:1、就我本身理解而言,我认为的单例:单例在整个工程中,就相当于一个全局变量,就是不论在哪里需要...

  • iOS-单例模式

    swift的单例设计模式 OC的单例设计模式 新学习一种单例思想

  • iOS-单例模式

    static修饰变量 修饰全局变量:全局变量的作用域仅限于当前文件内部(不加的话别人使用extern关键字就能从其...

  • 【设计模式】单例模式

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

  • Android设计模式总结

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

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • 设计模式之单例模式详解

    设计模式之单例模式详解 单例模式写法大全,也许有你不知道的写法 导航 引言 什么是单例? 单例模式作用 单例模式的...

  • ios-设计模式-单例

    1)单例是一种编程思想,一个设计模式,与语言无关在采用了单例对象的应用程序中,需要单例类自行提供实例化单例对象,不...

网友评论

    本文标题:iOS-单例模式

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