zoukankan      html  css  js  c++  java
  • 单例的写法

    1.

    #import "MySingleton.h"

    static MySingleton *_singleton = nil;

    + (id)shareObject

    {

        @synchronized(self){

            if (_singleton == nil) {

                _singleton = [[MySingleton alloc] init];

            }

        }

        return _singleton;

    }

    @end

    @synchronized 的作用是创建一个互斥锁,保证此时没有其它线程对self对象进行修改。这个是objective-c的一个锁定令牌,防止self对象在同一时间内被其它线程访问,起到线程的保护作用。 一般在公用变量的时候使用,如单例模式或者操作类的static变量中使用。

    2.

    #import "MySingleton.h"

    @implementation MySingleton

    + (id)shareObject

    {

        static MySingleton *_singleton = nil;

        static dispatch_once_t onceToken;

        dispatch_once(&onceToken, ^{

            _singleton = [[MySingleton alloc] init];

        });

        return _singleton;

    }

    @end

    void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);
        该函数接收一个dispatch_once用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上作为BOOL使用)。它还接收一个希望在应用的生命周期内仅被调度一次的代码块,对于本例就用于shared实例的实例化。
    dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如@synchronized之类的来防止使用多个线程或者队列时不同步的问题。
     该方法有很多优势: 
               1 线程安全
               2 很好满足静态分析器要求
               3 和自动引用计数(ARC)兼容 
               4 仅需要少量代码
  • 相关阅读:
    关于Dijkstra三种堆速度的研究
    [BZOJ1041][HAOI2008]圆上的整点[数论]
    [BZOJ2482][Spoj1557] Can you answer these queries II[线段树]
    [CF600E]Lomsat gelral[dsu on tree/树上启发式合并]
    [BZOJ3495]PA2010 Riddle[2-SAT]
    [9.26模拟] 伪造
    [bzoj4722] 由乃
    [bzoj2004] 公交线路
    [51nod1314] 定位系统
    [51nod1143] 路径和树
  • 原文地址:https://www.cnblogs.com/wudan7/p/3909412.html
Copyright © 2011-2022 走看看