dispatch_once的使用

来源:互联网 发布:php用户管理系统代码 编辑:程序博客网 时间:2024/06/06 04:21
在学习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;

}

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

0 0