iOS使用宏写单例

本文只介绍ARC情况下的单例

过去一直背不下来单例如何写,就是知道这么回事,也知道通过宏来写单例,但是一直记不住,今天就来记录一下

- (void)viewDidLoad {
    [super viewDidLoad];
    SIPerson *person = [[SIPerson alloc] init];    NSLog(@"%@",person);

    SIPerson *person1 = [[SIPerson alloc] init];    NSLog(@"%@",person1);

}

创建person,打印,实际上是2个对象。没毛病.

创建方法

#import "SIPerson.h"

static SIPerson *instance_ = nil;
@implementation SIPerson
///方法1,快速创建对象
+ (instancetype)sharedInstance{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance_ = [[self alloc] init];
    });
    return instance_;
}

///方法2.这个方法一定要有,就是alloc] init]方法,一定会调用这个方法
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance_ = [super allocWithZone:zone];
    });
    return instance_;
}
@end
//此处还应该有一个+ copy方法,因为可能是copy,那么有可能是生成新的方法

方法12都要实现,才能是单例。假如方法2没有实现,通过sharedInstance实现的确实是一个单例,但是通过alloc] init]有生成了另一个对象

2016-09-17 14:17:45.086 SharedInstance[9158:611161] 2016-09-17 14:17:45.087 SharedInstance[9158:611161]

如果你的对象将来可能还要调用copy(应该声明协议),那么你应该还要实现一个方法

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

copy的时候,一般是生成了一个新的对象,所以不是单例了,但是用的时候比较少,不是特别需要的,可以不实现这个方法,为毛要这样去写?因为他是对象方法,instance_里面有值

    [super viewDidLoad];
    SIPerson *person = [SIPerson sharedInstance];
    NSLog(@"%@",person);

    SIPerson *person1 = [[SIPerson alloc] init];
    NSLog(@"%@",person1);    

    SIPerson *person2 = [person1 copy];
    NSLog(@"%@",person2);

结果如下

2016-09-17 14:24:10.555 SharedInstance[9199:615987] 2016-09-17 14:24:10.555 SharedInstance[9199:615987] 2016-09-17 14:24:10.556 SharedInstance[9199:615987]

/**
 *  在.h文件中定义的宏,arc
 *
 *  SISingletonH(name) 这个是宏
 *  + (instancetype)shared##name;这个是被代替的方法, ##代表着shared+name 高度定制化
 * 在外边我们使用 “SISingletonH(gege)” 那么在.h文件中,定义了一个方法"+ (instancetype)sharedgege",所以,第一个字母要大写
 *
 *  @return 一个搞定好的方法名
 */
#define SISingletonH(name) + (instancetype)shared##name;

/**
 *  在.m文件中处理好的宏 arc
 *
 *  SISingletonM(name) 这个是宏,因为是多行的东西,所以每行后面都有一个"\",最后一行除外,
 * 之所以还要传递一个“name”,是因为有个方法要命名"+ (instancetype)shared##name"
 *  @return 单利
 */
#define SISingletonM(name) static SIPerson *instance_ = nil;+ (instancetype)shared##name{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        instance_ = [[self alloc] init];    });    return instance_;}+ (instancetype)allocWithZone:(struct _NSZone *)zone{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        instance_ = [super allocWithZone:zone];    });    return instance_;}- (id)copyWithZone:(NSZone *)zone{    return instance_;}

实际使用

//.h文件SISingletonH(Default)
//.m文件SISingletonM(Default)

都是一句话,都没有符号(定义的时候就给了符号),就这么简单



在实际使用的时候

 [super viewDidLoad];
    SIPerson *person = [SIPerson sharedDefault];
    NSLog(@"%@",person);

    SIPerson *person1 = [[SIPerson alloc] init];
    NSLog(@"%@",person1);

    SIPerson *person2 = [person1 copy];
    NSLog(@"%@",person2);

//打印结果
2016-09-17 14:56:39.508 SharedInstance[9292:633076] 2016-09-17 14:56:39.508 SharedInstance[9292:633076] 2016-09-17 14:56:39.508 SharedInstance[9292:633076]

拿来就可以使用的文件地址

简单说一下如何定义swift版本的单例,正常写,没研究过单例



时间: 2024-10-27 05:23:57

iOS使用宏写单例的相关文章

手写单例singleton

1 // 2 // ViewController.m 3 // singleton 4 // 5 // Created by ys on 15/11/23. 6 // Copyright (c) 2015年 ys. All rights reserved. 7 // 8 9 10 #import "ViewController.h" 11 #import "singletonClass.h" 12 13 @interface ViewController () 14

IOS 使用dispatch_once 创建单例

+ (instantClass *)sharedClient { static instantClass *_sharedClient = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedClient = [[instantClass alloc] init]; }); return _sharedClient; } IOS 使用dispatch_once 创建单例,码迷,mamicode.co

【Swfit】Swift与OC两种语法写单例的区别

Swift与OC两种语法写单例的区别 例如写一个NetworkTools的单例 (1)OC写单例 1 + (instancetype)sharedNetworkTools { 2 static id instance; 3 4 static dispatch_once_t onceToken; 5 6 dispatch_once(&onceToken, ^{ 7 instance = [[self alloc] init]; 8 //这里可以做一些初始化 9 }); 10 11 return i

iOS 开发中的单例

在iOS开发中经常会用到单例,比如每个iOS程序本身就是一个单例,在比如进行个人偏好设置存储的时候用的也是一个单例.那我们如何自己来写一个单例类呢,用自己的单例对象呢?下面是我写的一个单例的头文件里的代码,这个文件主要是一些宏.使用步骤写的都很详细,ARC或MRC都可以使用. //  Singleton.h //  单例的宏 /* 使用方法 1:包含这个头文件 2:在.h文件总包含 singleton_h(name) 里面的name是你想要生成单例对象时的名字 3:在.m文件中包含 single

你研究过单例么?这样写单例效率最高.

首先,小汤我在这里,要表示一下歉意,本来是想要每天写一篇Swift的学习小tip的,无奈近期手头的money花差的差点儿相同了,仅仅能迫不得已,出门找工作去了,没能履行承诺之处还请大家见谅. 那么,废话不多说了,開始我们今天的主题: 单例 ! 单例介绍: 说到单例,大家应该都不陌生,在传说中的那23种 (为啥我就会6种捏o(╯□╰)o-) 设计模式中,单例应该是属于和简单工厂模式并列的最简单的设计模式了,也应该是最经常使用的. 像这样简单易懂,又能有效提高程序执行效率的设计模式,作为一个iOS程

单例创建及宏实现单例

创建一个类Tool 继承于NSobject 这里用了两种方式创建单例,注释部分代码比较繁琐,非注释部分为GCD,本人感觉看起来比较干净. 如果是在 非ARC状态下运行 需要自定义release,retain,retainCount,防止单例运用时能释放 在.h里添加该类方法 因为一个程序或者一个项目在应用单例时,频率比较高,所以需要大量的创建单例类,然后重复上面的创建,导致代码内容重复,质量不高,因此,我们可以将单例进行宏实现,这样以后再次创建单例时,.h文件里和.m文件里都只需一行代码解决问题

iOS 利用dispatch_once创建单例

无论是爱还是恨,你都需要单例.实际上每个iOS或Mac OS应用都至少会有UIApplication或NSApplication. 什么是单例呢?Wikipedia是如此定义的: 在软件工程中,单例是一种用于实现单例的数学概念,即将类的实例化限制成仅一个对象的设计模式. 或者我的理解是: 单例是一种类,该类只能实例化一个对象. 尽管这是单例的实际定义,但在Foundation框架中不一定是这样.比如NSFileManger和NSNotificationCenter,分别通过它们的类方法defau

转--python 中写单例

原文地址 原文地址2 Python中的单例模式的几种实现方式的及优化 阅读目录(Content) 单例模式 实现单例模式的几种方式 1.使用模块 2.使用装饰器 3.使用类 4.基于__new__方法实现(推荐使用,方便) 5.基于metaclass方式实现 相关知识 实现单例模式 回到顶部(go to top) 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对

[💯原]IOS之Objectic-C的单例的两种安全实现方案

所有转出博客园,请您注明出处:http://www.cnblogs.com/xiaobajiu/p/4122034.html Objectic-C的单例的两种安全实现方案 首先应该知道单例的实现有两大类,一个是懒汉式,一个是饿汉式.所谓的懒汉式就是在我们用到某对象(资源)的时候,去问一个负责提供的方法要那个对象.那个方法发现没有这个资源时就去创建资源,如果是已经有该资源时就直接返回这个资源.而饿汉式就是那个负责提供的方法早已为我们准备好了我们想要的资源问它,它就提供给我们那个它早就准备好了的资源