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

这个是多年前写的了,如今修改了下格式搬到了我们简书网的平台,希望大家喜欢。

单例模式是iOS设计模式中常用到的设计模式之一,常用于网络数据请求,数据库操作等频繁调用的模块,作用呢很简单,就是节省内存,避免对统一操作进行多次内存开辟而造成不必要的内存浪费。

废话不多说了,直接上代码:

新建Singleton类

.h文件
#import <Foundation/Foundation.h>
@interface Singleton : NSObject
+(Singleton *)singleton;
@end

.m文件
#import "Singleton.h"

static Singleton *share = nil;

@implementation Singleton

+(Singleton *)singleton{   
     @synchronized(self) {       
         if(share == nil) {           
             share = [[[self class] alloc] init];       
         }    
     }    
    return share;
}
@end

OK,到此以前的我觉得已经写完一个单例类了,很多初学者也只是写到这一步,确实仅凭这些代码可以完成单例的实现,但是在实际运用过程中他是有缺陷的。

比如在团队合作过程中,另一个程序猿并不知道这个类是单例类,用alloc init来实现一个对象,那么这个对象就是这个类的普通对象,所以说到这里你应该知道问题所在了吧。

解决上述问题其实也简单,只需要重写allocWithZone方法,保证即使有人使用alloc init方法获取的依旧是已存在的单例(或者第一次创建时走单例方法)。

我们需要修改.m代码如下:

#import "Singleton.h"

static Singleton *share = nil;

@implementation Singleton

+ (Singleton *)singleton{   
     @synchronized(self) {       
         if(share == nil) {           
            share = [[super allocWithZone:NULL] init];       
         }    
     }    
    return share;
}

+ (instancetype) allocWithZone:(struct _NSZone *)zone{
    return [self singleton];
}

@end

OK,这样就可以确保无论谁怎么使用这个类,最终获取的都是同一个单例。

细心的初学者朋友可能会对这句话有问题:@synchronized(self)@synchronized的作用是创建一个互斥锁,防止self对象在同一时间内被其它线程访问,起到线程的保护作用。

最后再给出一个高大上的方法(GCD实现单例),这算是比较高阶的写法了,只需要对singleton方法进行如下修改:
+ (Singleton*) singleton{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
share = [[super allocWithZone:NULL] init];
});
return share;
}

创造即永恒,喝茶去……

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 2,538评论 1 8
  • 前文提要: 之前简友说让举栗子,那么今天我们就来举栗子。前文传送门:iOS设计模式、架构模式、框架简介之《设计模式...
    Fun箱Dao柜阅读 1,896评论 1 51
  • 单列模式:整个程序的生命周期内,只会创建一个类的实例化对象,而且只要程序还在运行,实例对象就不会释放。 ·单例模式...
    墨凌风起阅读 346评论 0 0
  • 如果觉得我写的还不错,请关注我的新浪微博@小橘爷,最新文章即时推送~ 单例模式 单例模式的作用是解决“应用中只有一...
    小橘爷阅读 503评论 2 1
  • 粗体验 随便点击了几个,界面感觉挺清爽的,大块的留白,黑白蓝为主,强调色用的很克制主要的界面分为首页,发现,消息和...
    静默之思阅读 544评论 0 52