zoukankan      html  css  js  c++  java
  • 单例的创建的各种方法

    单例设计模式:

    单例的写法:

    1. GCD 实现单例:

    @interface Singleton : NSObject

    + (Singleton *)sharedSingleton; <1>

    @end

    /***************************************************************/

    //Singleton.m

    #import "Singleton.h"

    @implementation Singleton   

    static Singleton *sharedSingleton = nil;<2>

    + (Singleton *)sharedSingleton{

        static dispatch_once_t once;<3>

        dispatch_once(&once,^{

            sharedSingleton = [[self alloc] init];<4>

            //dosometing

        });

        return sharedSingleton;<5>

    }

    51. 2. static3. 4. dispatch_once5. 返回在整个应用的生命周期中只会被实例化一次的变量

    2.标准单例

    /*

     开发中 一般写单例类 没有必要写标准单例 只需要写一个 非标准的函数+ sharedSingleton就够了,因为我们创建/获取单例 都是调用函数sharedSingleton

     有些时候我项目要求 调用alloc 也要创建出单例 而且 可能会让单例调用 retain/copy、release autorelease 那么这个时候我们就必须要重写 官方的这些方法 保证 不管调用什么函数 始终程序只有一个对象

     */

    //定义静态全局变量

    static Singleton * single = nil;

    + (Singleton *)sharedSingleton{

        //考虑线程安全

        @synchronized(self){

            if (single == nil) {

                single = [[self alloc] init];

            }

        }

        return single;

    }

    //调用 alloc的时候 会 调用allocWithZone函数

    + (id)allocWithZone:(NSZone *)zone

    {

        @synchronized(self) {

            if (single == nil) {

                //创建 对象

                single = [super allocWithZone:zone];

                return single;

            }////确保使用同一块内存地址

        }

        return single; //

    }

    - (id)copyWithZone:(NSZone *)zone

    {

        return self;//返回自己

    }

    - (id)retain

    {

        return self;//确保计数唯一

    }

    - (NSUInteger)retainCount

    {

        return UINT_MAX;      //返回最大值

    }

    //oneway这一般是线程之间通信的接口定义。表示单向的调用

    //使用oneway 异步调用 不使用那么是同步调用 可能会阻塞

    - (oneway void)release

    {

        //do nothing

    }

    - (id)autorelease

    {

        return self;

    }

    高级宏实现单例?

    #define DEFINE_SINGLETON_FOR_HEADER(className)

    + (className *)shared##className;

    DEFINE_SINGLETON_FOR_HEADER(Singleton2)

    ————————————————————————————————————————————

    #define SYNTHESIZE_SINGLETON_FOR_CLASS(classname)

    static classname *shared##classname = nil;

    + (classname *)shared##classname

    {

    @synchronized(self)

    {

        if (shared##classname == nil)

        {

        shared##classname = [[self alloc] init];

        }

    }

    return shared##classname;

    }

    + (id)allocWithZone:(NSZone *)zone

    {

    @synchronized(self)

    {

    if (shared##classname == nil)

    {

        shared##classname = [super allocWithZone:zone];

        return shared##classname;

    }

    }

        return nil;

    }

    - (id)copyWithZone:(NSZone *)zone

    {

        return self;

    }

    - (id)retain

    {

        return self;

    }

    - (NSUInteger)retainCount

    {

        return UINT_MAX;

    }

    - (oneway void)release

    {

    }

    - (id)autorelease

    {

    return self;

    }

    SYNTHESIZE_SINGLETON_FOR_CLASS(Singleton2)

    ARC 和MRC 的怎么创建单例?

    //ARC下或者 mrc  gcd

    //单例函数写法

    + (id)sharedInstance

    {

        static dispatch_once_t once = 0;//保证其block块在应⽤用中只执⾏行⼀一次

        static id _sharedObject = nil;

        dispatch_once(&once, ^{

            _sharedObject = [[self alloc] init];

        });

        return _sharedObject;

    }

    //非arc

    + (Singleton5 *)sharedSingleton{

        static Singleton5 *single = nil;

        //考虑线程安全

        @synchronized(self){

            if (single == nil) {

                single = [[self alloc] init];

            }

        }

        return single;

    }

  • 相关阅读:
    Wannafly挑战赛14 F.细胞
    D 勤奋的杨老师(二)(最小割)
    三分算法求最值
    初识最大流
    初识数据结构
    决策型DP
    哈希表
    【BZOJ】1878: [SDOI2009]HH的项链 (主席树)
    【HDU】1520 Anniversary party(树形dp)
    【UVa】1606 Amphiphilic Carbon Molecules(计算几何)
  • 原文地址:https://www.cnblogs.com/PengFei-N/p/4703192.html
Copyright © 2011-2022 走看看