浅谈iOS中的单例模式

在一个ios应用中,有时候我们只需要某个类的一个实例。即是在整个项目中,这个类的对象只能被初始化一次。

例如,当应用程序启动时,应用的状态由UIApplication类的一个实例维护,这个实例则代表了整个"应用程序对象",它只能是一个实例,其作用是实现整个应用程序中一些共享资源的访问和状态的保持等。

说通俗点,通常代表一些物理设备,比如打印机。或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据。用单例模式加以控制是非常有必要的。

OS中好几个类都是采用了单例模式,比如NSApplication, NSFontManager,  NSDocumentController,NSHelpManager, NSNull,NSProcessInfo, NSScriptExecutionContext,  NSUserDefaults。

OC实现原理:


//Singleton.h

@interface Singleton:NSObject

+(Singleton *)sharedManager;

@property  (nonatomic,strong)NSString *singletonData;

@end


//Singleton.m

#import"Singleton.h"

@implementation Singleton

@sysnthesize singletonData=_singletonData;

static Singleton *sharedManager=nil;

+(Singleton *)sharedManager {

static dispatch_once_t_once;

dispatch_once(&once,^{

       sharedManager=[[]self alloc]init];

});

return sharedManager;

}

@end


上面用了GCD技术,作用是在整个应用生命周期中只执行一次代码块^{......}。使用时需要将GCD地址传给dispatch_oce函数。dispatch_once函数能够记录该代码块是否被调用过。

dispatch_once函数不仅意味着代码仅会被运行一次,而且还意味着此运行还是线程同步。也就是说,当我们使用dispatch_once函数时,就不要需要使用@synchronized之类的语句。



Swift实现原理

import Foundation

class Singleton {

  class var sharedInstance:Singleton { //静态计算属性

       struct Static {                               //定义结构体

          static var instance:Singleton?     //定义静态属性instance 用来保存singleton的子单例对象

         static var token:dispatch_once_t=0   //定义静态属性token,是dispatch_once_t的类型

}

     dispatch_once(&Static.token)  {          //传地址给dispatch_once .记录该代码块是否被调用过。同时意味着线程同步。

    Static.instance=Singleton()                 //实例化Singleton对象

}

return Static.instance!                   //返回实例

}

}


swift设计单例模式非常灵活,有非常多的方式。上面是考虑线程安全的单例模式。


有错误之处还望大神指正,交流。









最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 7,243评论 1 8
  • 单例:意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单...
    CoderZS阅读 3,696评论 1 13
  • 单例模式(SingletonPattern)一般被认为是最简单、最易理解的设计模式,也因为它的简洁易懂,是项目中最...
    成热了阅读 9,859评论 4 34
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,833评论 19 139
  • 前段时间微博上有个很火的游戏《2048》。我们以它为例子,继续谈谈游戏中的状态。如果你没玩过这个游戏,这就点开玩玩...
    bylin阅读 6,999评论 1 8

友情链接更多精彩内容