dispatch_once的使用

本文介绍了单例设计模式的概念及其实现方式,并详细解析了如何利用dispatch_once在iOS开发中实现线程安全的单例模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在学习dispatch_once之前,需要学习的就是单例设计模式了。作为23种经典设计模式之一,虽然简单,但是非常的实用。
那么什么是单例设计模式呢? 以下是百度百科的解释,:
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
链接为:http://baike.baidu.com/view/1859857.htm?fr=aladdin
维基百科的解释为:
单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。
链接为:http://zh.wikipedia.org/wiki/单例模式

其核心的思想:单例类有且只有一个实例。

在Apple当中,可以通过dispath_once来实现单例模式。以下是引入apple的说明:
可以看到  
    1)代码仅仅会运行一次:Executes a block object once and only once for the lifetime of an application.
    2)多线程安全的:If called simultaneously from multiple threads, this function waits synchronously until the block has completed.
    3)在IOS4.0之后引入的: Available in iOS 4.0 and later.

同时需要注意的是:
    1)The predicate must point to a variable stored in global or static scope.

dispatch_once


Executes a block object once and only once for the lifetime of an application.

   void dispatch_once(
   dispatch_once_t *predicate,
   dispatch_block_t block);

Parameters
predicate

A pointer to a dispatch_once_t structure that is used to test whether the block has completed or not.()

block

The block object to execute once.

Discussion

This function is useful for initialization of global data (singletons) in an application. Always call this function before using or testing any variables that are initialized by the block.

If called simultaneously from multiple threads, this function waits synchronously until the block has completed.

The predicate must point to a variable stored in global or static scope. The result of using a predicate with automatic or dynamic storage (including Objective-C instance variables) is undefined.
Availability
  • Available in iOS 4.0 and later.
Declared In
dispatch/once.h


以下为具体创建的实例:
  + (ModalManage *)SharedModal

{

    static dispatch_once_t once;

    static id instance = nil;

    dispatch_once(&once, ^{

        instance = [[self alloc]init];

    });

    return instance;

}

可以看到,仅仅几行代码,就实现了一个线程安全的单例实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值